[英]Index using temporary and filesort
我有这个查询:
SELECT date(DATE_SAISIE) , count(DATE_SAISIE) as total
FROM appel_offre
GROUP BY date(DATE_SAISIE)
ORDER BY DATE_SAISIE
我在DATE_SAISIE
有索引
create index mi_date on appel_offre(DATE_SAISIE)
这是explain
cmd:
+----+-------------+-------------+-------+---------------+---------+---------+------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+-------+---------------+---------+---------+------+------+----------------------------------------------+
| 1 | SIMPLE | appel_offre | index | mi_date | mi_date | 6 | NULL | 25 | Using index; Using temporary; Using filesort |
+----+-------------+-------------+-------+---------------+---------+---------+------+------+----------------------------------------------+
在extra
的栏中,有Using temporary; Using filesort
Using temporary; Using filesort
所以我认为查询会很慢,如何避免呢?
using temporary
意味着MySQL必须创建一个临时表来生成结果。 这是因为您grouping by
列中的函数grouping by
。 如果仅在列上输出函数的结果,则MySQL不必记住该值,但是由于要将所有记录与该函数的结果分组在一起,因此必须将这些结果存储在某个位置。
using filesort
排序是一个令人吃惊的名字拙劣的暗示,表明MySQL将需要对一些临时存储进行排序才能生成结果。 这是因为您是ordering by
索引中列上的函数ordering by
而不是按列本身ordering by
。
摆脱文件排序或至少使其更快的一种方法是,按您选择的相同顺序进行订购:
SELECT date(DATE_SAISIE), count(*) as total
FROM appel_offre
GROUP BY date(DATE_SAISIE)
ORDER BY date(DATE_SAISIE)
这将提供与查询完全相同的结果,但可能使MySQL不必自己记住DATE_SAISIE值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.