使用临时和filesort索引

时间:2015-02-13 17:47:02

标签: mysql sql

我有这个问题:

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所以我认为查询会很慢,如何避免?

1 个答案:

答案 0 :(得分:1)

  • using temporary表示MySQL必须创建临时表以生成结果。这是因为你在grouping by列上了一个函数。如果您只是在列上输出函数的结果,MySQL就不必记住该值,但是因为您想要将具有该函数结果的所有记录组合在一起,它必须将这些结果存储在某处。

    < / LI>
  • 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值。