我有一个包含两个表的数据库。一个包含帐户,另一个包含超过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。
答案 0 :(得分:0)
首先,我要从loc.GATENAVN = UPPER(addr.Gate)
删除上部,因为此子句已经在case insensitive mode中搜索。
答案 1 :(得分:0)
我使用子查询而不是连接