如何下车使用临时;使用我的查询中的filesort

时间:2012-02-09 20:50:27

标签: mysql indexing sql-execution-plan

解释

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?

1 个答案:

答案 0 :(得分:0)

文件排序的原因是行返回由festival_id排序,并且您按时间重新排序它们,因此mysql需要重新排序结果。鉴于您的架构和查询,我没有看到一个简单的方法。如果我是你,我不会太担心文件档案。它真的没那么糟糕。请阅读here了解详情。

我还应该指出,使用LEFT JOIN没有意义。由于您的WHERE子句引用了可选表,因此它会取消外连接。您应该考虑重写该查询。