我有一个表,我需要从中按降序获取字段排序的行。运行EXPLAIN
查询时,如下所示:
EXPLAIN SELECT ... FROM table WHERE ... ORDER BY field DESC
我在Using where; Using filesort
列中获得了Extra
。所以我尝试创建一个DESC
索引:
CREATE INDEX name ON table (field DESC);
但是,当我再次运行EXPLAIN
时,Using where; Using filesort
列中的Extra
会得到相同的结果,而且效果几乎相同。
我做错了什么?
答案 0 :(得分:46)
这是MySQL“功能”中的一个,它默默地忽略了你做某事的请求,因为它根本没有实现:
来自http://dev.mysql.com/doc/refman/5.5/en/create-index.html
“ index_col_name规范可以以ASC或DESC结尾。这些关键字允许用于指定升序或降序索引值存储的未来扩展。目前,它们被解析但被忽略;索引值总是以升序存储< / I>“
答案 1 :(得分:11)
如上所述,该功能尚未实施,但可能会引起一些解决方法:
一种可能性是将字段存储在否定值或反向值中。
如果是一个数字,你可以存储(-n)或(MAXVAL -n)如果未签名
如果是日期或时间戳,有人会提倡存储数字而使用FROM_UNIXTIME()等函数
当然,这种改变并不总是容易做到的......取决于现有的代码等。
答案 2 :(得分:3)
MySQL从版本8开始支持DESC索引。在此之前,DESC被默默地忽略了。这对于(a)单列索引或(b)多列索引都不是问题,其中所有列都有一个方向:所有ASC或所有DESC - 因为索引是双向的。
但是,如果您需要列方向不同的多列索引,例如你运行多个这样的quires:
SELECT * from MyTable WHERE ColumnA = 1 ORDER BY ColumnB ASC, ColumnC DESC
您需要以下索引:(ColumnA,ColumnB ASC,ColumnC DESC)
您可以在版本8之前的MySQL中使用此参数创建索引,但事实上它创建的很简单(ColumnA ASC,ColumnB ASC,ColumnC ASC)
因此,您的查询无法完全使用该索引 - 它只使用索引中的A列和B列,而使用未索引的(filesort)作为C列。
这将不再是MySQL 8.0及更高版本中的问题。见https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html