我使用INNER JOIN和WHERE与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小时内完成。我想知道索引是否存在问题,或者是否有更有效的方法来执行此任务
答案 0 :(得分:4)
Mysql不会对已应用函数的列使用索引。
其他数据库允许基于函数的索引。
你可以创建一个只包含a.street和b.street的前8个字符的列,然后将它们编入索引,事情会更快。
答案 1 :(得分:1)
这是您的查询:
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)
。这可以使用索引的两个组件。在任何情况下,即使它不能使用索引的两面,它也可能获得更好的性能。