1. 程式人生 > 其它 >MySQL --- 讀書筆記 --- 索引(3)

MySQL --- 讀書筆記 --- 索引(3)

從幾個方面優化資料庫

  • 索引失效
  • 關聯查詢太多
  • 伺服器調優
  • 資料過多

優化技術分為

  • 物理優化:主要是索引的使用
  • 邏輯優化:SQL的等價變換

索引失效案例

MySQL提高效能的一個最有效的方式就是對資料表設計有效的索引,但是最終用不用索引,是優化器決定的,它不是根據規則,也不是根據語義,而是基於開銷(cost),怎麼開銷小怎麼做。SQL語句是否使用索引,跟資料庫版本、資料量、資料選擇度都有關係。

1. 全值匹配

會盡可能多的匹配最佳索引,當WHERE條件較多時,匹配更多的聯合索引,可以使得回表時,搜尋更少的記錄

2. 最佳左字首法則

對於多列索引,過濾條件要使用索引必須按照索引建立時的順序,依次滿足,一旦跳過某個欄位,索引後面的欄位都無法使用

。如果查詢條件中沒有使用這些欄位中的第一個欄位,聯合索引不會被使用

3. 主鍵插入順序

在聚簇索引中,記錄是按照主鍵順序儲存,一個頁滿了,新建一個頁繼續插入,如果插入的主鍵忽大忽小,那麼在一個頁滿了之後,再想從中間插入一條記錄,就會發生頁分裂記錄移位的情況,這意味著效能損耗。所以最好讓插入的主鍵依次遞增

4. 計算、函式、型別轉換導致索引失效

5. 範圍條件右邊的列索引失效

CREATE INDEX index_a_c_n ON S1(age,classId,name)

EXPLAIN SELECT * FROM S1 WHERE age=3 AND classsId > 20 AND `name`='abc'
  • 只使用了前兩個索引列,最後一個沒有使用
  • 可以在建立索引時,就考慮這種情況,將範圍條件放在聯合索引的最後,這樣就可以使用全索引

6. 不等於判斷-索引失效

7. is null可以使用索引,is not null無法使用索引

8. like以萬用字元%開頭索引失效

9. OR 前後存在非索引的列,索引失效

OR前後的兩個條件中的列都是索引時,查詢中才使用索引

10. 資料庫和表的字符集統一使用utf8mb4

相容性更好,統一字符集可以避免由於字符集轉換產生亂碼,不同字符集進行比較之前需要進行轉換,會造成索引失效

一般性建議

  • 對於單列索引,儘量選擇針對當前query過濾性更好的索引
  • 在選擇聯合索引的時候,當前query中過濾性最好的欄位在索引欄位順序中,越靠前越好
  • 在選擇聯合索引的時候,儘量選擇能夠包含當前query中的where子句中更多欄位的索引
  • 在選擇聯合索引的時候,如果某個欄位出現範圍查詢,儘量把這個欄位放在索引次序的最後