MySQL學習筆記(3)——索引練習

根據之前的MYSQL學習筆記(2)的學習,通過一些小練習來加深對索引的理解。

建下表並插入數據最後建立相關索引:

CREATE TABLE IF NOT EXISTS `test`(
id int PRIMARY KEY auto_increment,
c1 char(10),
c2 char(10),
c3 char(10),
c4 char(10),
c5 char(10)
);

INSERT INTO test(c1,c2,c3,c4,c5) VALUES
('a1','a2','a3','a4','a5'),
('b1','b2','b3','b4','b5'),
('c1','c2','c3','c4','c5'),
('d1','d2','d3','d4','d5'),
('e1','e2','e3','e4','e5');

CREATE INDEX idx_test_c1234 ON test(c1,c2,c3,c4); //添加索引

考察SQL下列語句是否用到索引並分析其原因

1、SELECT * FROM test WHERE c1 = ‘a1’ AND c2 = ‘a2’ AND c3 > ‘a3’ AND c4 = ‘a4’

該語句c1和c2的索引會被用來查找,c3索引會被用來排序,而c4用不到索引。因此這裏只有前三個會用到索引。

2、SELECT * FROM test WHERE c1 = ‘a1’ AND c2 = ‘a2’ AND c4 > 'a4’AND c3 = ‘a3’

該語句用到四個索引,在執行時MySQL優化器會將該語句順序編程建立索引的順序,即

SELECT * FROM test WHERE c1 = 'a1' AND c2 = 'a2' AND c3 = 'a3' AND c4 > 'a4'

在這裏插入圖片描述
則c1、c2、c3索引將會被用來查找,而c4的索引將會被用來排序。每個索引長度爲11,四個一共44.

3、SELECT * FROM test WHERE c1 = ‘a1’ AND c2 = ‘a2’ AND c4 = ‘a4’ ORDER BY c3

該語句僅僅用到兩個索引,下圖的ref可知有兩個const(常量)即c1和c2 。由於c4缺少了c3,違反了最左前綴原則。所以c4不會用到索引。同樣的,c3處沒有用到索引查找。
在這裏插入圖片描述

4、SELECT * FROM test WHERE c1 = ‘a1’ AND c2 = ‘a2’ ORDER BY c3

和上調語句比較,僅僅差別在沒有了c4 = 'a4’這個條件,但結果是一樣的。
在這裏插入圖片描述

5、SELECT * FROM test WHERE c1 = ‘a1’ AND c2 = ‘a2’ ORDER BY c4

同樣的,只用到了兩個索引,但是缺少了c3,因此在對c4排序時缺少索引,因此會使用到filesort內排序。
在這裏插入圖片描述

6、SELECT * FROM test WHERE c1 = ‘a1’ AND c5 = ‘a5’ ORDER BY c2,c3

只用到了c1索引,c2、c3索引用於排序。
在這裏插入圖片描述

7、SELECT * FROM test WHERE c1 = ‘a1’ AND c5 = ‘a5’ ORDER BY c3,c2

僅僅和上條語句在order by後面順序對調,但性能差了許多,使用到了文件內排序。這是因爲最左前綴原則導致order by後面的語句無法使用索引排序。
在這裏插入圖片描述

8、SELECT * FROM test WHERE c1 = ‘a1’ AND c2 = ‘a2’ ORDER BY c2,c3

用到兩個索引,order by後面索引用於排序。
在這裏插入圖片描述

9、SELECT * FROM test WHERE c1 = ‘a1’ AND c2 = ‘a2’ ORDER BY c3,c2

根據第7條來說,order by後面不符合索引順序,應該產生文件內排序,但是結果很意外:
在這裏插入圖片描述
並沒有用到filesort,這是因爲,在where條件中有c2 = ‘a2’這一條件。這一條件的出現使得c2的查詢級別變爲了const(常量)如上圖ref中顯示。因此,即使在order by中未按照索引順序排列,但是c2是個常量,排序並不影響。

10、SELECT * FROM test WHERE c1 = ‘a1’ AND c4 = ‘a4’ GROUP BY c2,c3

查詢結果與order by的語句類似,只用到了一個索引查找即c1。

11、SELECT * FROM test WHERE c1 = ‘a1’ AND c4 = ‘a4’ GROUP BY c3,c2

與上面order by不同的是,不僅會用到filesort,還會用到臨時表(temporary)。用到filesort的原因不解釋,用到臨時表是因爲group by在分組之前要先排序。排序是將結果放在臨時表中。
在這裏插入圖片描述





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章