优化表上的mysql更新超过百万条记录

时间:2014-07-08 05:27:16

标签: mysql

我有一个mysql表,其中包含大约170万条记录。目标是填补表格中缺少的信息。以下是我想要做的伪代码:

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。

2 个答案:

答案 0 :(得分:1)

经过一些研究和实验,我发现索引不会用于领先通配符查询(类型为%value的查询),因此通过改进查询进行优化的任何努力都是徒劳的。

幸运的是,我知道最重要的变种将属于领先通配符查询(覆盖最多记录的那些),并且我通过避免LIKE子句直接搜索它们。在涵盖了大部分记录之后,我将其余记录复制到另一个表中,并使用LIKE子句来实现我的目标。

感谢所有帮助过的人。

答案 1 :(得分: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