MySQL --- 讀書筆記 --- 索引(3)
阿新 • • 發佈:2022-05-22
從幾個方面優化資料庫
- 索引失效
- 關聯查詢太多
- 伺服器調優
- 資料過多
優化技術分為
- 物理優化:主要是索引的使用
- 邏輯優化: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子句中更多欄位的索引
- 在選擇聯合索引的時候,如果某個欄位出現範圍查詢,儘量把這個欄位放在索引次序的最後