[英]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() );
編輯:
編輯:
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)
優化自連接。 您可能需要花點時間弄清楚什么有效。
索引的目的是加快搜索和篩選的速度……索引是(用外行術語而言)排序表,可精確定位數據的每一行(其本身可能未排序)。
因此,如果您想加快刪除查詢的速度,將有助於了解數據的位置。 因此,作為一組經驗法則,您需要將索引添加到以下字段:
我避免在文本字段上進行索引,因為它們非常昂貴(就空間而言),但是如果您需要對文本字段進行頻繁的搜索,則還應該對它們進行索引。
如果您的目標是刪除重復項,則解決方案是避免首先出現重復項-在您認為要共同定義重復項的字段上定義唯一索引(但您無法在創建索引時數據庫中有重復項)。
你需要為這個查詢的索引是(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.