使用LEFT()函数查询性能不佳

时间:2014-02-28 20:39:37

标签: mysql performance

我使用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.streetb.street都被编入索引(部分索引8)。

查询未在24小时内完成。我想知道索引是否存在问题,或者是否有更有效的方法来执行此任务

2 个答案:

答案 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的前缀索引和直接字符串比较。如果我假设idtableA合并,则以下内容可能会更好:

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)。这可以使用索引的两个组件。在任何情况下,即使它不能使用索引的两面,它也可能获得更好的性能。