rid*_*rid 24 mysql performance
我有一个表,我需要从中按降序获取字段排序的行.运行如下EXPLAIN
查询时:
EXPLAIN SELECT ... FROM table WHERE ... ORDER BY field DESC
Run Code Online (Sandbox Code Playgroud)
我得到Using where; Using filesort
的Extra
列.所以我尝试创建一个DESC
索引:
CREATE INDEX name ON table (field DESC);
Run Code Online (Sandbox Code Playgroud)
但是当我EXPLAIN
再次运行时,我Using where; Using filesort
在Extra
列中得到了相同的结果并且性能基本相同.
我究竟做错了什么?
a_h*_*ame 47
这是MySQL"功能"中的一个,它默默地忽略了你做某事的请求,因为它根本没有实现:
来自http://dev.mysql.com/doc/refman/5.5/en/create-index.html
" index_col_name规范可以以ASC或DESC结尾.这些关键字允许用于指定升序或降序索引值存储的未来扩展.目前,它们被解析但被忽略;索引值总是以升序存储 "
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)。
归档时间: |
|
查看次数: |
19759 次 |
最近记录: |