如何下车使用临时;从我的查询中使用的filesort
问题描述:
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
为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
如何避免使用临时;在Events中使用filesort?
答
这个文件的原因是这些行按照festival_id的顺序重新排序,并且你按照时间对它们重新排序,所以mysql需要重新排序结果。根据您的模式和查询,我没有看到一个简单的方法。如果我是你,我不会太担心文件夹。这听起来并不像听起来那么糟糕。阅读here了解更多信息。
我还应该指出,你使用LEFT JOIN
没有意义。由于您的WHERE
子句引用了可选表,因此它将取消外部联接。你应该考虑重写查询。
你如何获得重写,一个事件有不同的时间,许多事件有一个节日,并且必须按时间显示列表顺序 – 2012-02-10 03:30:12