2012-04-11 73 views
20

我有一张表,我需要从字段按降序获取行。当运行一个查询EXPLAIN类似如下:如何在MySQL中创建DESC索引?

EXPLAIN SELECT ... FROM table WHERE ... ORDER BY field DESC 

我得到的ExtraUsing where; Using filesort。所以我尝试创建一个DESC指数:

CREATE INDEX name ON table (field DESC); 

但是当我再次运行EXPLAIN,我得到的Extra列相同Using where; Using filesort,性能几乎相同。

我在做什么错?

回答

43

这就是那些MySQL的“功能”在那里静静地忽略你的要求做的事情之一,因为它根本就没有实现。

http://dev.mysql.com/doc/refman/5.5/en/create-index.html

的index_col_name规约可以以ASC或DESC结束这些关键字被允许用于指定升序或降序索引值存储的目前,它们被解析但忽略;索引值总是以升序存储

+2

“散列”索引也是如此。为什么MySQL开发人员允许在他们的“CREATE INDEX”语句中执行任何操作,但没有执行任何操作? – akki 2016-07-25 18:22:25

10

如上所述,该功能不是实现但有些解决方法可能会引起您的兴趣:

一种可能性是将字段存储为否定或反向值。

如果它是一个数字,你可以存储(N)或(MAXVAL -n)如果没有符号

如果它是一个日期或时间戳,有些人会主张存储号码,而不是和使用功能,如FROM_UNIXTIME( )

当然,这样的变化并不总是很容易做到的...取决于现有的代码等

1

的MySQL从8版开始支持降序索引。在此之前,DESC被无声地忽略了。对于(a)单列索引或(b)对于所有列都有一个方向的多列索引,这不是问题:既可以是全部ASC,也可以是全部DESC - 因为索引是双向的。

但是,如果您需要列方向不同的多列索引,例如你运行多个奎雷斯这样的:

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,而对列C使用未索引(filesort) 。

这将不再是MySQL 8.0及更高版本中的一个问题。请参阅https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html