2014-07-08 164 views
1

我有一個包含大約170萬條記錄的mysql表。目標是填寫表中缺失的信息。下面是什麼,我試圖做的僞代碼:優化mysql表更新百萬記錄

SELECT DISTINCT A,B FROM table1 

每個值A1,B1從上面的查詢

SELECT C FROM table2 WHERE A LIKE '%A1' AND B LIKE '%B1' 
UPDATE table1 SET C=C WHERE A=A1 AND B=B1 

不幸的是,問題的本質是,A1價值的零部件和B1在table2列中,所以我不能使用JOIN語句。

有大約0.15萬個獨特的更新必須進行,這將影響170萬條記錄。

我已經分別在表1和表2的列A1,B1上建立索引。

我寫了一個簡單的python腳本來完成上述操作,但是想象一下運行腳本太慢了 - 它現在運行了大約15個小時,只有1/4的工作已經完成。

如何優化mysql中的查詢。這些表使用InnoDB。

+0

您可以使用所需的列和所需的值創建臨時表,並使用此臨時表的聯接進行更新。 – VMai

+0

經過一番研究和實驗後,我發現索引不會用於前導通配符查詢(%value類型的查詢),所以任何優化工作都是徒勞的。幸運的是,對於我來說,我知道屬於前導通配符查詢(覆蓋最多記錄數的查詢)的最重要變體,並且我通過避免使用LIKE子句直接搜索它們。在覆蓋大部分記錄之後,我將其餘記錄複製到另一個表中,並使用LIKE子句來實現我的目標。感謝所有幫助過我的人。 – user1872325

回答

0

最好的辦法可能是加入table1table2這兩個表,如下所示。雖然我不確定列A1B1是從哪裏來的。根據您的表格結構,下面的示例代碼可能不準確;您可能不得不根據實際的表格定義更改列名稱。

UPDATE table1 a 
    JOIN table2 b ON a.A = b.A 
    AND a.B = b.B 
    AND b.A LIKE '%A1' AND b.B LIKE '%B1' 
SET a.C = b.C 
1

了一些研究和實驗後,我發現索引不會被用於領先的通配符查詢(類型%值的查詢),那麼任何努力優化通過改進查詢只是徒勞。

幸運的是,對於我來說,我知道屬於前導通配符查詢(覆蓋最多記錄數的查詢)的最重要變體,並且我通過避免使用LIKE子句直接搜索它們。在覆蓋大部分記錄之後,我將其餘記錄複製到另一個表中,並使用LIKE子句來實現我的目標。

感謝大家幫助。

相關問題