如何在MySQL中创建DESC索引?

rid*_*rid 24 mysql performance

我有一个表,我需要从中按降序获取字段排序的行.运行如下EXPLAIN查询时:

EXPLAIN SELECT ... FROM table WHERE ... ORDER BY field DESC
Run Code Online (Sandbox Code Playgroud)

我得到Using where; Using filesortExtra列.所以我尝试创建一个DESC索引:

CREATE INDEX name ON table (field DESC);
Run Code Online (Sandbox Code Playgroud)

但是当我EXPLAIN再次运行时,我Using where; Using filesortExtra列中得到了相同的结果并且性能基本相同.

我究竟做错了什么?

a_h*_*ame 47

这是MySQL"功能"中的一个,它默默地忽略了你做某事的请求,因为它根本没有实现:

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

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

  • "哈希"索引也是如此.为什么MySQL开发人员在其"CREATE INDEX"语句中允许所有内容但不实现任何内容? (2认同)
  • _这对于 MySQL 8.0 来说已经过时了;查看另一个答案._ (2认同)

phi*_*l_w 11

如上所述,该功能尚未实现,但可能会引起一些解决方法:

一种可能性是将字段存储在否定值或反向值中.

如果是一个数字,你可以存储(-n)或(MAXVAL -n)如果是无符号的

如果它是一个日期或时间戳,有些人会提倡存储一个数字而使用诸如FROM_UNIXTIME()之类的函数

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


Max*_*tin 10

MySQL 从版本 8 开始支持降序索引。在早期版本中,创建索引时会默默忽略“DESC”子句。对于 (a) 单列索引或 (b) 对于所有列都有一个方向的多列索引,这不是问题:要么全是 ASC,要么全是 DESC——因为索引是双向的。

但是,如果您需要一个列方向不同的多列索引,例如,您可以像这样运行多个查询:

SELECT * from MyTable WHERE ColumnA = 1 ORDER BY ColumnB ASC, ColumnC DESC
Run Code Online (Sandbox Code Playgroud)

您需要以下索引:(ColumnA、ColumnB ASC、ColumnC DESC)。

您可以在版本 8 之前的 MySQL 中使用这些参数创建索引,但它是静默创建的,实际上,所有列都升序(ColumnA ASC、ColumnB ASC、ColumnC ASC)。

因此,您的查询无法完全使用该索引 - 它仅从索引中获取 A 列和 B 列,同时对 C 列使用未索引(文件排序)数据。

这在 MySQL 8.0 及更高版本中将不再是问题。见https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html

MySQL 8 版已于 2018 年 4 月 19 日正式发布(v8.0.11)。