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
列中,有使用临时的;使用文件排序
所以我认为查询速度会很慢,如何避免它?
意味着MySQL必须创建一个临时表来生成结果。这是因为您正在按列上的函数进行分组。如果您只是在列上输出函数的结果,MySQL就不必记住该值,但是因为您希望将所有记录与该函数结果组合在一起,所以它必须将这些结果存储在某个位置使用temporary
是一个非常糟糕的名称,表明MySQL需要对一些临时存储进行排序才能生成结果。这是因为您是按索引中列上的函数而不是列本身排序的使用filesort
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)或在typedate
中添加一个新列,正如@Mihai所说的,这完全取决于表中有多少数据。仅仅因为它说使用临时
和使用文件排序
并不意味着它会很慢。它可以是10万行。。。我试着用同样的方法来排序,但我总是使用临时的和文件排序