Mysql

是否可以向具有多列的 mysql 添加索引以按性能優化順序?

  • April 27, 2012
 # 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)

我的問題是

  1. 索引是否優化了性能?
  2. 為什麼使用索引;同時使用文件排序顯示?

您需要(c2, c1)為該查詢創建一個索引,而不是(c1, c2).

當然,最好有(c2 DESC, c1 DESC)第一個查詢的索引(c2 DESC, c1 ASC)和第二個查詢的索引。不幸的是 MySQL 不能創建這樣的索引。和ASCDESC忽略。

這意味著您的兩個索引:

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列和適當的索引用於類似的解決方案(更好一點,因為您不必添加觸發器,列將自動填充)。

引用自:https://dba.stackexchange.com/questions/17140