簡體   English   中英

提高查詢刪除重復項的性能

[英]Improve performance for query to delete duplicates

我的托管公司最近從慢查詢日志中給了我這個條目。 檢查的行似乎過多,可能有助於降低服務器速度。 phpMyAdmin中的測試導致持續時間為0.9468秒。

Check_in表通常包含10,000至17,000行。 它還有一個索引:Num,唯一=是,基數= 10852,排序規則=A。

我想改善這個查詢。 WHERE之后的前五個條件包含要檢查以排除重復項的字段。

# User@Host: fxxxxx_member[fxxxxx_member] @ localhost []
# Query_time: 5  Lock_time: 0  Rows_sent: 0  Rows_examined: 701321
use fxxxxx_flifo;
SET timestamp=1364277847;
DELETE FROM Check_in USING Check_in, 
Check_in as vtable WHERE 
    ( Check_in.empNum = vtable.empNum ) 
AND ( Check_in.depCity = vtable.depCity ) 
AND ( Check_in.travelerName = vtable.travelerName ) 
AND ( Check_in.depTime = vtable.depTime ) 
AND ( Check_in.fltNum = vtable.fltNum ) 
AND ( Check_in.Num > vtable.Num ) 
AND ( Check_in.accomp = 'NO' ) 
AND Check_in.depTime >= TIMESTAMPADD ( MINUTE, 3, NOW() )
AND Check_in.depTime < TIMESTAMPADD ( HOUR, 26, NOW() );

編輯:

  • empNum int(6)
  • 姓氏varchar(30)
  • travellerName varchar(40)(99.9%='全部')
  • depTime日期時間
  • fltNum varchar(6)
  • depCity varchar(4)
  • 總共23個場(包括一個斑點,可容納25K圖像)

編輯:

ADD INDEX deleteQuery (empNum, lastName, travelerName, depTime, fltNum, depCity, Num)

這是創建索引的問題嗎? 如果是這樣,什么類型和什么字段?

最后三個條件通過詢問是否完成以及在時間段內來限制行數。 是否可以在查詢中更好地(更早地)定位它們? 第五個AND ...必要?

開放給所有想法。 感謝您的光臨。

在不查看表定義的情況下很難確切地知道如何提供幫助。

不要刪除自我check_in.Num > vtable.Num (兩次提及同一張表),因為此查詢正在清除重復項( check_in.Num > vtable.Num )。

您在depTime上有索引嗎? 如果沒有,請添加一個。

您可能還希望在上添加復合索引

 (empNum,depCity,travelerName,depTime,fltNum)

優化自連接。 您可能需要花點時間弄清楚什么有效。

索引的目的是加快搜索和篩選的速度……索引是(用外行術語而言)排序表,可精確定位數據的每一行(其本身可能未排序)。

因此,如果您想加快刪除查詢的速度,將有助於了解數據的位置。 因此,作為一組經驗法則,您需要將索引添加到以下字段:

  1. 每個主鍵或外鍵
  2. 您執行頻繁搜索/過濾的每個日期
  3. 您經常執行搜索/過濾的每個數字字段

我避免在文本字段上進行索引,因為它們非常昂貴(就空間而言),但是如果您需要對文本字段進行頻繁的搜索,則還應該對它們進行索引。

如果您的目標是刪除重復項,則解決方案是避免首先出現重復項-在您認為要共同定義重復項的字段上定義唯一索引(但您無法在創建索引時數據庫中有重復項)。

你需要為這個查詢的索引是(deptime,empnum,depcity,travellername,fltnum,NUM, 在為了伴奏}。該deptime領域具有先來為它優化了2訪問在桌子上。一旦你刪除重復項,使索引唯一。

暫時將其擱置一旁,您會遇到很多性能問題。

1)您似乎正在提供某種商業服務-那么為什么要等待ISP告訴您您的站點像狗一樣運行?

2)雖然您的索引應設計為防止重復,但在許多情況下,其他索引將有助於提高性能-但為了了解這些內容,您需要查看針對數據運行的所有查詢。

3)Blob可能應該在單獨的表中

是否可以在查詢中更好地(更早地)定位它們?

查詢層次結構中同一級別的謂詞順序對性能沒有影響。

第五個是必須的嗎?

如果您的意思是“ AND(Check_in.Num> vtable.Num)”,那么可以-如果不這樣做,它將刪除所有重復的行-即,不會留下任何一行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM