MYSQL最左前綴原則


建立聯合索引后,數據庫會生成一顆B+樹,值是主鍵。

回表:從聯合索引表中查詢到數據后,在回到主鍵表查詢,避免數據冗余。

 

CREATE TABLE `t1` (
  `id` int NOT NULL,
  `a` int DEFAULT NULL,
  `b` int DEFAULT NULL,
  `c` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_bc` (`b`,`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

先任意插入12條數據

第一種情況

 

上圖中查詢表所有字段時,條件c遵循最左前綴原則。在b+中查詢類似 *c,所以不使用索引查詢,使用全表掃描。

 

 

 

 

 上圖中,查詢指定字段,並且遵循了最左原則,系統會自動優化。

 

 范圍查詢時,當查詢的行數一旦過多,回表數量一旦增多,則不會使用索引。(系統內部自行判斷回表成本和全文掃描查詢成本)

  索引列不應該作為表達式的一部分,一旦對列改變后,就不能使用索引查詢,對磁盤中的數據進行,會增大開銷。

 

order by 中索引

 

 查找字段覆蓋索引字段

 

 查找字段沒有覆蓋索引字段

一般情況下:where子句對於order 而言起到的是輔助作用

 

一般FileSort方式的查詢情況:

1、檢查的行數過多,且沒有使用覆蓋索引

2、使用了不同的索引,MySQL每回只采用一個索引

3、對索引列同時使用了ASC和DESC

4、where語句與order by語句,使用了不同的索引

需要先把a也設為索引

5、where語句或者ORDER BY語句中索引列使用了表達式

6、where 語句與ORDER BY語句組合滿足最左前綴,但where語句中使用了條件查詢

7、order by子句中加入了非索引列,且非索引列不在where子句中

8、order by或者它與where組合沒有滿足索引最左前列

9、當使用left join,使用右邊的表字段排序

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM