如何确保此查询符合索引?

时间:2011-03-19 04:48:00

标签: mysql sql indexing

我有一个包含两个表的数据库。一个包含帐户,另一个包含超过200万行包含地址及其坐标。显然,如果有这么多行,那么任何时候运行一个没有充分利用索引的查询,如果不是几个小时就完成。不幸的是,我的一个查询目前就是这种情况:

SELECT
    addr.`Linje-ID` as lineid,
    addr.`Sluttbruker` as companyname,
    addr.`Gate` as street,
    addr.`Husnr` as housenr,
    addr.`Postnr` as zip,
    addr.`Poststed` as location,
    loc.`UX_KOORDINAT` as coord_x,
    loc.`UY_KOORDINAT` as coord_y,
    loc.`ADRESSE_ID` as addr_id

FROM
    addresses addr INNER JOIN
    locationdata loc ON
        loc.`POSTSTED` = addr.`Poststed` AND
        loc.`POST_NR` = addr.`Postnr` AND
        loc.`GATENAVN` = addr.`Gate` AND
        loc.`HUSNUMMER` = addr.`Husnr`

GROUP BY
    addr.`Linje-ID`

locationdata表具有主索引ID以及定义为(POSTSTED,POST_NR,GATENAVN,HUSNUMMER)的索引。使用这些列中的那些列从表中获取行非常快。但是,上面的查询必须取消,因为它花了太长时间(> 15分钟)。

当我的MySQL客户端(HeidiSQL)在执行查询时冻结,强制关闭应用程序并重新尝试修复此问题变得非常繁琐,所以我在这里寻求帮助。

仅用于测试,表“地址”目前只包含一行。

任何人都可以确定为什么这个查询“永远不会”完成?


这是我被要求的EXPLAIN结果 http://pastebin.com/qWdQhdv5

您应该复制内容并将其粘贴到更大的容器中,因为它是换行符。


编辑:我编辑了查询以反映您的一些回复。它仍然使用超过300秒,它不需要1。

2 个答案:

答案 0 :(得分:0)

首先,我要从loc.GATENAVN = UPPER(addr.Gate)删除上部,因为此子句已经在case insensitive mode中搜索。

答案 1 :(得分:0)

我使用子查询而不是连接