Mysql 使用临时和文件排序进行索引

Mysql 使用临时和文件排序进行索引,mysql,sql,Mysql,Sql,我有一个疑问: SELECT date(DATE_SAISIE) , count(DATE_SAISIE) as total FROM appel_offre GROUP BY date(DATE_SAISIE) ORDER BY DATE_SAISIE 我有关于日期的索引 create index mi_date on appel_offre(DATE_SAISIE) 这是explaincmd: +----+-------------+-------------+-------+--

我有一个疑问:

SELECT date(DATE_SAISIE) , count(DATE_SAISIE) as total 
FROM appel_offre 
GROUP BY date(DATE_SAISIE) 
ORDER BY 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
列中,有
使用临时的;使用文件排序
所以我认为查询速度会很慢,如何避免它?

  • 使用temporary
    意味着MySQL必须创建一个临时表来生成结果。这是因为您正在按列上的函数进行分组。如果您只是在列上输出函数的结果,MySQL就不必记住该值,但是因为您希望将所有记录与该函数结果组合在一起,所以它必须将这些结果存储在某个位置

  • 使用filesort
    是一个非常糟糕的名称,表明MySQL需要对一些临时存储进行排序才能生成结果。这是因为您是按索引中列上的函数而不是列本身排序的

摆脱文件排序的一种方法,或者至少使其更快,是按您选择的相同内容进行排序:

SELECT date(DATE_SAISIE), count(*) as total 
FROM appel_offre 
GROUP BY date(DATE_SAISIE) 
ORDER BY date(DATE_SAISIE)

这将给出与您的查询完全相同的结果,但可能允许MySQL不必记住日期值本身。

表定义会有所帮助,但答案是列上的函数阻止使用索引。但它使用索引
mi_date
我不明白order by的重要意义是什么?我不知道为什么它说它使用索引。它不能。可能涉及计数。但你可以在你的应用程序中这样做,只需获取整个datetime并用php或任何您正在使用的语言对其进行子串。取决于行数,可能超过10000行,您必须在应用程序中进行此操作。只需对其进行测试,mysql Online有一些数据生成器,那么这是如何回答这个问题的呢?OP询问如何避免
使用临时的
使用filesort
。我已经解释了他们出现的原因。谢谢,知道问题出在哪里真的很有帮助。。。但是我的专栏在
datetime
中,所以我必须使用
date()
@Mihai建议我使用我的服务器语言(java)或在type
date
中添加一个新列,正如@Mihai所说的,这完全取决于表中有多少数据。仅仅因为它说
使用临时
使用文件排序
并不意味着它会很慢。它可以是10万行。。。我试着用同样的方法来排序,但我总是使用临时的
文件排序