如何在MySQL中创建DESC索引?

时间:2012-04-11 15:29:29

标签: mysql performance

我有一个表,我需要从中按降序获取字段排序的行。运行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会得到相同的结果,而且效果几乎相同。

我做错了什么?

3 个答案:

答案 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