我有一个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。
答案 0 :(得分:1)
经过一些研究和实验,我发现索引不会用于领先通配符查询(类型为%value的查询),因此通过改进查询进行优化的任何努力都是徒劳的。
幸运的是,我知道最重要的变种将属于领先通配符查询(覆盖最多记录的那些),并且我通过避免LIKE子句直接搜索它们。在涵盖了大部分记录之后,我将其余记录复制到另一个表中,并使用LIKE子句来实现我的目标。
感谢所有帮助过的人。
答案 1 :(得分:0)
最好的方法可能是加入表格table1
和table2
,如下所示。虽然我不确定列A1
和B1
出现在哪里。根据您的表结构,下面的示例代码可能不准确;您可能需要根据实际的表定义更改列名。
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