2011-05-12 36 views
2

這個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上添加了一個索引,但它似乎沒有成功。

+0

你是怎麼以上剖面的統計數據?使用了什麼工具? – 2015-04-04 12:35:05

+0

肯定它的顯示配置命令,請參見[這裏](http://stackoverflow.com/questions/1012887/how-to-profile-mysql) – alex9311 2016-06-20 11:48:58

回答

0

應用上urls.idresults.url_id索引,然後再試一次。

+0

謝謝。我確實在results.url_id上添加了一個索引,而urls.id是表的主鍵。上面的配置文件是在索引添加之後。 – 2011-05-12 20:46:07

+0

是否具有相同數據類型的urls.id和results.url_id?如果不是,則數據庫服務器有可能會轉換數據以匹配索引。 – Bjoern 2011-05-12 20:48:30

+0

@Bjoern是的。 results.url_id是int(11)NOT NULL,urls.id是int(11)NOT NULL AUTO_INCREMENT。我想我的問題的一部分是'更新參考表'是什麼意思 - 是查找行,物理更新行還是兩者? – 2011-05-12 20:51:08

0

那是更新frequenly運行?

如果是這樣 - 嘗試更新僅是真的不同的值。

如果沒有 - 7秒內讓說,每天一次是相當快的。

相關問題