Mysql
是否可以向具有多列的 mysql 添加索引以按性能優化順序?
# I have a simple table create table t1 (c1 int, c2 int); # I want to do the following sorting select * from t1 order by c2 desc, c1 desc; select * from t1 order by c2 asc, c1 desc; # add indexs CREATE INDEX index_1 ON t1 (c1 DESC, c2 DESC); CREATE INDEX index_2 ON t1 (c1 ASC, c2 DESC); # then explain explain select * from t1 order by c2 desc, c1 desc; # the result is mysql> explain select * from t1 order by c2 desc, c1 asc; +----+-------------+-------+-------+---------------+---------------+---------+------+------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------------+---------+------+------+-----------------------------+ | 1 | SIMPLE | t1 | index | NULL | index_2 | 10 | NULL | 6 | Using index; Using filesort | +----+-------------+-------+-------+---------------+---------------+---------+------+------+-----------------------------+ 1 row in set (0.00 sec)
我的問題是
- 索引是否優化了性能?
- 為什麼使用索引;同時使用文件排序顯示?
您需要
(c2, c1)
為該查詢創建一個索引,而不是(c1, c2)
.當然,最好有
(c2 DESC, c1 DESC)
第一個查詢的索引(c2 DESC, c1 ASC)
和第二個查詢的索引。不幸的是 MySQL 不能創建這樣的索引。和ASC
被DESC
忽略。這意味著您的兩個索引:
CREATE INDEX index_1 ON t1 (c1 DESC, c2 DESC); CREATE INDEX index_2 ON t1 (c1 ASC, c2 DESC);
實際上與您將它們定義為相同且相同:
CREATE INDEX c1_c2_index ON t1 (c1 ASC, c2 ASC);
如果性能 - 與
(c2, c1)
索引 - 不夠好,您有幾個選擇:
- 由於列是整數類型,因此再添加兩列並儲存負值。您需要觸發器來填充這些列。
.
CREATE TABLE ( c1 INT , c2 INT , c1_neg INT , c2_neg INT );
然後你可以索引
(c2_neg, c1)
和(c2_neg, c1_neg)
- 如果您可以遷移到 MariaDB,則可以將
VIRTUAL PERSISENT
列和適當的索引用於類似的解決方案(更好一點,因為您不必添加觸發器,列將自動填充)。