2013-07-31 81 views
0

加入一個表時,下面是我的查詢加快mysql的更新與LIKE

UPDATE cdata AS gcd 
LEFT JOIN tar AS ap 
ON gcd.dialled 
LIKE CONCAT(ap.prefix, '%') 
SET gcd.prefix=ap.prefix, gcd.destination1=ap.destination 
WHERE gcd.prefix=0; 

這似乎超時,我想知道,如果它是這樣做等。 cdata有大約140000條記錄,它的搜索大約有25000個焦點。所以我猜mysql對140000條記錄中的每條記錄都進行了25000次查找?

我需要找到一種方法來加速它,如果可能的話。

感謝您的任何幫助

+0

是否有gcd.dialled上的索引? – fthiella

+0

您可以要求MySql解釋它將如何執行您的查詢 - 請參閱http://dev.mysql.com/doc/refman/5.0/en/explain.html – dash

+0

是的,有撥號和前綴索引 – jhodgson4

回答

0

這種方法是錯誤的。您不應該對無限數據使用UPDATE查詢。

+0

那麼我應該採取什麼方法? – jhodgson4

1

這是一個黑客,應該是一個更好的方式,也許用UNION?分解成7個查詢,1 ap.prefix的每個長度是可能的:

UPDATE cdata AS gcd 
JOIN tar AS ap 
ON substring(gcd.dialled, 1, 3) = ap.prefix 
SET gcd.prefix=ap.prefix, gcd.destination1=ap.destination 
WHERE gcd.prefix=0 
; 
-- ... 
UPDATE cdata AS gcd 
JOIN tar AS ap 
ON substring(gcd.dialled, 1, 9) = ap.prefix 
SET gcd.prefix=ap.prefix, gcd.destination1=ap.destination 
WHERE gcd.prefix=0 
; 

運行所有的查詢,並應更新所有的數據在合理的時間。 (注:我切換到JOIN而不是LEFT JOIN,以避免將NULL放入以前爲0的行中)。

+0

這很有趣,謝謝!我可以在PHP中運行一個查詢嗎? – jhodgson4

+0

這工作完美,並在幾秒鐘內完成!感謝您的幫助! – jhodgson4

+0

@ jhodgson4我管理了一個'UNION'版本。然而它更慢更醜陋。我嘗試了'IN'語句和'OR'語句,但由於某種原因無法獲得最優化(它們非常慢並且沒有運行)。 – 2013-07-31 20:18:29