我使用了INNER JOIN和WHERE with LEFT函数来匹配前8个字符的记录。
INSERT INTO result SELECT id FROM tableA a
INNER JOIN tableB b ON a.zip=b.zip
WHERE LEFT(a.street,8)=LEFT(b.street,8)
a.street
和b.street
都被索引(部分索引8)。查询在24小时以上没有完成。我想知道索引是否有问题,或者是否有更有效的方法来执行此任务
最佳答案
这是您的问题:
INSERT INTO result
SELECT id
FROM tableA a INNER JOIN
tableB b ON a.zip=b.zip
WHERE LEFT(a.street,8)=LEFT(b.street,8);
MySQL不够聪明,无法在这种比较中使用前缀索引。它将使用前缀索引进行
like
和直接字符串比较。如果我假设id
是从tableA
合并而来,则以下操作可能会执行得更好:INSERT INTO result(id)
SELECT id
FROM tableA a
WHERE exists (select 1
from tableB b
where a.zip = b.zip and
b.street like concat(left(a.street, 8), '%')
);
您需要的索引是
tableB(zip, street(8))
或tableB(zip, street)
。这可能同时使用索引的两个组件。在任何情况下,即使不能同时使用索引的两边,它也可能获得更好的性能。关于mysql - 使用LEFT()函数的查询性能不佳,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22105364/