高性能MySQL讀書筆記---索引優化

索引優化

索引是儲存引擎中用於快鎖查找記錄的一種數據結構服務器

  1. 索引類型數據結構

    • B-Tree索引
      B-Tree一般意味着全部的值都是按順序儲存的,而且每個葉子頁到根的距離相同。

    B-Tree對索引是順序組織存儲的,因此很適合查找範圍數據。
    B-Tree索引適用於全鍵值、鍵值範圍或鍵前綴查找。其中鍵前綴查找只適用於根據最左前綴的查找。
    適用場景:優化

    1. 全值匹配,和索引中的全部列進行匹配。
     2. 匹配最左前綴,只能使用索引的第一列
     創建channel_id,ref索引,單獨查詢channel_id時能夠用到索引,單獨查詢ref時用不到索引,檢索了所有數據

    clipboard.png

clipboard.png

clipboard.png

3. 匹配列前綴,使用LIKE查詢時只能查詢以什麼開頭時才能用到索引,而且只能用到索引第一列  
     例如創建了name_age(name,age) 的聚合索引,查詢以張字開頭的姓而且年齡爲18的數據時只能用到name索引,而查以輝字結尾的姓別時用不到索引。
     創建ref,channel_id的索引,ref使用like查詢時掃描了70萬行,改成等於查詢時掃描了10萬行

clipboard.png

clipboard.png

clipboard.png

4. 匹配範圍值 當索引中列有範圍查找時其後面列也將沒法使用到索引
     當channel_id使用範圍查詢時,使用索引檢索了全部大於30的channel_id,可是索引第二列的ref沒有使用索引

clipboard.png

clipboard.png

- 哈希索引
 哈希索引是基於哈希表實現的。(感受使用場景很少,並且只支持Memory引擎表,略過)
 - 空間數據索引
 - 全文索引 用於查找列中關鍵詞,不是直接比較索引中的值。
  1. 索引的優勢
    能夠減小服務器須要掃描的數據量,避免排序和臨時表,將隨機I/O變成順序I/O;
    何時使用索引:只有當索引幫助引擎快速查詢記錄的好處大於它帶來的額外工做時才使用索引。
  2. 索引優化spa

    • 簡化WHERE條件 始終將索引列放入=號得一側
    • 儘可能使用多列索引而不是吧WHERE的每一列都建上單獨的索引,並且當有多列索引的最左列索引和單列索引共同存在時MySQL查詢時會使用多列索引而不是單列索引,例如創建了ab(a,b),a,b三個索引 WHERE a=1 and
      b=2時只能使用到ab索引

    clipboard.png

clipboard.png

- 當服務器出現對多個索引的相交操做一般須要一個包含查詢列的多列索引而不是多個單列索引
- 創建多列索引時將選擇性最高的列放入索引的最左邊。
- 當數據重複性過高時,例如一張大表中有一半數據都包含着某個值,另外一邊包含着另外一個值   這樣的列就沒有創建因此的必要了。

例如圖中channel_id字段在400萬數據中有四分之一都是,就算創建索引每次查詢也會檢索100萬條記錄。 code

clipboard.png

- 當某幾個列同時查詢的頻率很高的時候,能夠針對這幾個列創建一個全覆蓋索引。
- 避免重複順序索引的建立,會形成索引冗餘。
建立一個多列索引,兩個單列索引,查詢時會使用多列索引而不是兩個單列索引

clipboard.png

clipboard.png

- 儘可能把須要範圍查詢的列放入多列索引的右面,便於優化器儘量索引大多數的列。
相關文章
相關標籤/搜索