2:MySQL索引選擇規則(惟一索引查詢)sql
students_origin表中只有主鍵,沒有創建索引。優化
select id, name from students_origin;
根據MySQL 索引選擇原則分析(一)2.1來分析,因此只能是全表掃描。
spa
students表中除主鍵外,還有3個索引惟一索引name,普通索引major,rank,聯合索引rank/total。.net
select id, name from students;
根據MySQL 索引選擇原則分析(一)2.1來分析,因此只查詢了一次輔助索引name。獲取到結果集。
code
select id, major from students;
根據MySQL 索引選擇原則分析(一)2.1來分析,因此只查詢了一次輔助索引major。獲取到結果集。blog
3:MySQL索引選擇規則(多個索引查詢)索引
select id, rank from students;
根據MySQL 索引選擇原則分析(一)2.1與2.3來分析,索引被2個索引覆蓋,因此選擇了索引長度最短的作查詢,獲取到結果集。
ci
4:MySQL索引選擇規則(聯合索引查詢)get
select id, rank, total from students;
根據MySQL 索引選擇原則分析(一)2.1來分析,因此只查詢了聯合索引rank/total。獲取到結果集。
class
5:MySQL索引選擇規則(條件索引查詢)
根據MySQL 索引選擇原則分析(一)2.1來分析,查詢的結果集中包含了rank/total字段,應該走的是聯合索引,可是
查詢執行計劃爲:
沒有走聯合索引,而是選擇了rank索引,主要緣由是where條件改變了查詢優化器的處理邏輯。查詢優化器根據查詢條件經過基於代價的處理,選擇查詢代價最低的索引。也就是說,首先經過索引idx_rank查找鍵值,在經過主鍵id查找對應的記錄,也就是須要2次IO操做。反而不如直接走聯合索引(只需一次IO操做)。