建立高效能的索引的一些策略
阿新 • • 發佈:2019-02-01
- 獨立的列和多列索引
1、不要在多個列上建立單獨的索引,單列的多個索引大部分情況下不能提升Mysql的查詢效能。而是選擇建立一個覆蓋索引或者對索引列的順序進行優化
2、在一個多列的B-Tree索引中,索引列 的順序意味著索引首先按照最左列進行排序,其次是第二列,等等。可以看出:索引可以按照升序或者降序進行掃描,來滿足複合列順序的Order by,group by 和distinct子句的查詢。經驗法則:將選擇性最高的列放在前面(用於在where的條件查詢)。 - 覆蓋索引
如果一個索引包含(覆蓋)所有需要查詢的欄位的值,稱之為“覆蓋索引”。可以看出,覆蓋索引只能針對某個查詢sql 的概念,例如
針對當前索引,sql 1:
select biz_refund_id,pay_log_id from orders where biz_refund_id = ‘jhjhhj’ and pay_log_id = ‘7812jsda’。針對這個sql而言,索引’idx_pay_log_id_biz_refund_id’ 就是覆蓋索引。
而針對sql2:
select biz_refund_id,pay_log_id,pay_memo from orders where biz_refund_id = ‘jhjhhj’ and pay_log_id = ‘7812jsda’。針對這個sql而言,索引’idx_pay_log_id_biz_refund_id’ 。則不是“覆蓋索引”。
覆蓋索引的好處:
1、索引條目通常遠小於資料行大小,如果只需要讀取索引,那mysql就會減少訪問資料量。同時對快取的負載非常重要,這種情況下,響應時間大部分花在資料拷貝上。覆蓋索引對於I/O密集型的應用也有幫助,因為索引比資料更小,更容易放入記憶體中。
2、針對InnoDB的聚簇索引,InnoDB的二級索引在葉子節點儲存了行的主鍵值,所以如果二級主鍵能耐夠覆蓋查詢,則幣可以避免對主鍵索引的二次查詢。因為如果查詢的列不在索引中,則mysql還得根據索引去磁碟中去讀取每一行的資料(根據索引去找,這通常是隨機的I/O)
注意:因為覆蓋索引必須要儲存索引列的值,而雜湊索引,空間索引和全文索引都不儲存索引列的值,所有不能作為覆蓋索引。在Mysql中,只能使用B-Tree索引作為覆蓋索引