我使用了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.streetb.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/

10-13 06:54