這個MySQL更新語句需要大約7秒,我想知道如何提高它的性能。總的查詢是很慢的,所以我就開始將它分解成小塊(每次100個IDS):是否有可能加快MySQL的「更新參考表」線程狀態?
UPDATE results
INNER JOIN urls
ON urls.id = results.url_id
SET results.url = urls.name
WHERE results.url_id >= 100
AND results.url_id < 200
基本上我建築「結果」最初具有NULL的results.url
一個反規範化表。我需要填寫urls.name
字段中的內容,但時間太長。該查詢修改大約25,000條記錄。
當我配置文件中的查詢,這裏的結果我看到:
starting 0.000052
checking permissions 0.000004
checking permissions 0.000005
Opening tables 0.000012
checking permissions 0.000003
checking permissions 0.000004
System lock 0.000004
Table lock 0.000007
init 0.000013
updating main table 0.000005
optimizing 0.000015
statistics 0.000114
preparing 0.000030
executing 0.000004
Sending data 0.239372
converting HEAP to MyISAM 0.165893
Sending data 0.239267
updating reference tables 6.585605
end 0.000029
end 0.000008
removing tmp table 0.007922
end 0.000007
query end 0.000005
freeing items 0.000286
logging slow query 0.000005
cleaning up 0.000004
由於查詢花費其大部分時間「更新」(超過65秒)時,有什麼我可以做嗎?我不清楚這是否意味着mysql花費時間查找要更新的行,或者花費的時間是否只是將位從一個表中複製到另一個表中。
如果它大約需要6.5秒,在值從一個表複製到另一個,有什麼我可以做(我假設,因爲它看起來並不像什麼打算盤?),但如果花時間定位的行更新,我認爲索引可能會有所幫助。我在results.url_id
上添加了一個索引,但它似乎沒有成功。
你是怎麼以上剖面的統計數據?使用了什麼工具? – 2015-04-04 12:35:05
肯定它的顯示配置命令,請參見[這裏](http://stackoverflow.com/questions/1012887/how-to-profile-mysql) – alex9311 2016-06-20 11:48:58