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;上面三個查詢按照 (a ), (a,b ),(a,b,c )的順序都可以利用到索引,這就是最左字首匹配。select * from table where a=1 and b=2;
select * from table where a=1 and b=2 and c=3;
如果查詢語句是:
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;如果用到了最左字首而只是顛倒了順序,也是可以用到索引的,因為mysql查詢優化器會判斷糾正這條sql語句該以什麼樣的順序執行效率最高,最後才生成真正的執行計畫。但我們還是最好按照索引順序來查詢,這樣查詢優化器就不用重新編譯了。select * from table where b=2 and a=1 and c=3;
字首索引
除了聯合索引之外,對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 建立索引的目的是加快對錶中記錄的查詢或排序。為表設定索引要付出代價的 一是增加了資料庫的儲存空間,二是在插入和修改資料時 要花...