索引使用策略及優化

2021-09-21 14:17:06 字數 2312 閱讀 7805

mysql的優化主要分為結構優化(scheme optimization)和查詢優化(query optimization)。本章討論的高效能索引策略主要屬於結構優化範疇。本章的內容完全基於上文的理論基礎,實際上一旦理解了索引背後的機制,那麼選擇高效能的策略就變成了純粹的推理,並且可以理解這些策略背後的邏輯。

聯合索引(復合索引)

首先介紹一下聯合索引。聯合索引其實很簡單,相對於一般索引只有乙個字段,聯合索引可以為多個字段建立乙個索引。它的原理也很簡單,比如,我們在(a,b,c)欄位上建立乙個聯合索引,則索引記錄會首先按照a欄位排序,然後再按照b欄位排序然後再是c欄位,因此,聯合索引的特點就是:第乙個字段一定是有序的,當第乙個字段值相等的時候,第二個欄位又是有序的,比如下表中當a=2時所有b的值是有序排列的,依次類推,當同乙個b值得所有c欄位是有序排列的

| a | b | c |

| 1 | 2 | 3 |

| 1 | 4 | 2 |

| 1 | 1 | 4 |

| 2 | 3 | 5 |

| 2 | 4 | 4 |

| 2 | 4 | 6 |

| 2 | 5 | 5 |

其實聯合索引的查詢就跟查字典是一樣的,先根據第乙個字母查,然後再根據第二個字母查,或者只根據第乙個字母查,但是不能跳過第乙個字母從第二個字母開始查。這就是所謂的最左字首原理。

最左字首原理

我們再來詳細介紹一下聯合索引的查詢。還是上面例子,我們在(a,b,c)欄位上建了乙個聯合索引,所以這個索引是先按a 再按b 再按c進行排列的,所以:

以下的查詢方式都可以用到索引

select * from table where a=1;

select * from table where a=1 and b=2;

select * from table where a=1 and b=2 and c=3;

上面三個查詢按照 (a ), (a,b ),(a,b,c )的順序都可以利用到索引,這就是最左字首匹配。

如果查詢語句是:

select * from table where a=1 and c=3; 那麼只會用到索引a。

如果查詢語句是:

select * from table where b=2 and c=3; 因為沒有用到最左字首a,所以這個查詢是使用者到索引的。

如果用到了最左字首,但是順序顛倒會用到索引碼?

select * from table where b=2 and a=1;

select * from table where b=2 and a=1 and c=3;

如果用到了最左字首而只是顛倒了順序,也是可以用到索引的,因為mysql查詢優化器會判斷糾正這條sql語句該以什麼樣的順序執行效率最高,最後才生成真正的執行計畫。但我們還是最好按照索引順序來查詢,這樣查詢優化器就不用重新編譯了。

字首索引

除了聯合索引之外,對mysql來說其實還有一種字首索引。字首索引就是用列的字首代替整個列作為索引key,當字首長度合適時,可以做到既使得字首索引的選擇性接近全列索引,同時因為索引key變短而減少了索引檔案的大小和維護開銷。

一般來說以下情況可以使用字首索引:

mysql 字首索引能有效減小索引檔案的大小,提高索引的速度。但是字首索引也有它的壞處:mysql 不能在 order by 或 group by 中使用字首索引,也不能把它們用作覆蓋索引(covering index)。

索引優化策略

最左字首匹配原則,上面講到了

補充

1、可以使用命令mysql> explain extended sql表示式  在使用show warnings來顯示優化後的sql語句

2、資料量比較大的時候,聯接查詢的效率高於巢狀子查詢

3、聯接查詢的時候,實際上mysql是先執行where在執行join ,有區別於傳統的mysql的執行順序 jion > where  

4、適當使用冗餘字段可以減少表之間的聯接,選取的冗餘字段一般很少變動或者不變動

5、連線欄位的字符集排序規則不同,會造成索引失效

join語句的優化

正規表示式不使用索引,這應該很好理解,所以為什麼在sql中很難看到regexp關鍵字的原因

索引優化策略

注 名叫btree索引,大的方面看,都用的平衡樹,但具體的實現上,個引擎稍 有不同,比如,嚴格的說,ndb引擎,使用的是t tree索引 myisam mnodb中預設使用b tree索引 但抽象一下 b tree系統,可理解為為 排好序的快速查詢結構 在memory 記憶體 表裡,預設是hash索...

mysql索引使用策略和優化

1.1 索引選擇原則 較頻繁的作為查詢條件的字段應該建立索引 唯一性太差的字段不適合單獨建立索引,即使頻繁作為查詢條件 更新非常頻繁的字段不適合建立索引 不會出現在 where 子句中的字段不該建立索引 1.2 索引選擇原則描述 1.3 索引選擇注意事項 既然索引可以加快查詢速度,那麼是不是只要是查...

查詢優化策略 索引

1 索引分為聚簇索引和非聚簇索引兩種,聚簇索引 是按照資料存放的物理位置為順序的,而非聚簇索引就不一樣了 聚簇索引能提高多行檢索的 速度,而非聚簇索引對於單行的檢索很快。2 建立索引的目的是加快對錶中記錄的查詢或排序。為表設定索引要付出代價的 一是增加了資料庫的儲存空間,二是在插入和修改資料時 要花...