解释
SELECT *
FROM `EventTimes`
LEFT JOIN Events on event_id=Events.id
WHERE festival_id = 12
ORDER BY time;
事件表的我有以下字段:
id
name
festival_id
等。
对于EventTimes表我有:
id
event_id
time
等。
我为EventTimes创建索引:create index eventid_time on EventTimes (event_id, time)
我还为事件创建了一个索引:create index ev_festivalid on Events (festival_id)
但我得到
事件的:
Select_type: Simple
Table : Events
Type : ref
possible_keys: PRIMARY,ev_festivalid
key : ev_festivalid
key_len: 5
ref: const
rows : 14
Extra : Using where; Using temporary; Using filesort
for EventTimes:
Select_type: Simple
Table : EventTimes
Type : ref
possible_keys: eventid_time
key : eventid_time
key_len: 5
ref: dbname.Events.id
rows : 1
Extra : Using where
如何避免使用临时;在事件中使用filesort?
答案 0 :(得分:0)
文件排序的原因是行返回由festival_id排序,并且您按时间重新排序它们,因此mysql需要重新排序结果。鉴于您的架构和查询,我没有看到一个简单的方法。如果我是你,我不会太担心文件档案。它真的没那么糟糕。请阅读here了解详情。
我还应该指出,使用LEFT JOIN
没有意义。由于您的WHERE
子句引用了可选表,因此它会取消外连接。您应该考虑重写该查询。