繁体   English   中英

使用临时索引和文件排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM