2012-02-09 94 views
0

解释如何下车使用临时;从我的查询中使用的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?

回答

0

这个文件的原因是这些行按照festival_id的顺序重新排序,并且你按照时间对它们重新排序,所以mysql需要重新排序结果。根据您的模式和查询,我没有看到一个简单的方法。如果我是你,我不会太担心文件夹。这听起来并不像听起来那么糟糕。阅读here了解更多信息。

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

+0

你如何获得重写,一个事件有不同的时间,许多事件有一个节日,并且必须按时间显示列表顺序 – 2012-02-10 03:30:12

相关问题