我有这个问题:
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
所以我认为查询会很慢,如何避免?
答案 0 :(得分:1)
using temporary
表示MySQL必须创建临时表以生成结果。这是因为你在grouping by
列上了一个函数。如果您只是在列上输出函数的结果,MySQL就不必记住该值,但是因为您想要将具有该函数结果的所有记录组合在一起,它必须将这些结果存储在某处。
using filesort
是一个非常糟糕的名称,表明MySQL需要对某些临时存储进行排序才能生成结果。这是因为您在索引中的列上而不是列本身上的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值。