【发布时间】:2014-03-13 07:50:23
【问题描述】:
我有以下表格
用户表
- 列:ID、电子邮件
- 索引:id
位置表
- 列 -> id、name、user_id、last_scan_time
- 索引:id, user_id
项目表
- 列 -> id、name、location_id、last_scan_time
- 索引:id, location_id
我必须运行这个查询来获取项目
select items.* from items
inner join locations on (items.last_scan_time = locations.last_scan_time and items.location_id = locations.id)
inner join users on (locations.user_id = users.id and users.email = 'abc@abc.com')
1056870 行的上述查询需要 13 秒
现在,如果我单独拆分每个查询而不是连接,则需要的时间会少得多
select id from users where email = 'abc@abc.com'
0.0 sec
select id,last_scan_time from locations where user_id = #user-id-returned-from-above-query#
0.0 sec
select * from items where last_scan_time = #last_scan_time-from-above-query# and location_id = #location-id-from-above-query#
0.01 sec
我必须对连接查询或索引进行哪些更改才能使连接查询的运行速度快于单个查询的总时间?
请帮忙。
谢谢你,
萨钦
【问题讨论】:
-
explain [your query]会告诉你发生了什么。特别是,哪些索引正在(不是?)被使用。 -
如果您希望我们帮助优化查询,您需要向我们展示实际的表和索引定义,以及每个表的行数。也许您的表格定义不佳。也许索引没有正确创建。也许您认为您在该列上没有索引。没有看到表和索引定义,我们无法判断。我们还需要行计数,因为这会极大地影响查询优化。如果您知道如何进行
EXPLAIN或获得执行计划,请将结果也放入问题中。