2012-04-11 74 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