Mysql優化
Mysql優化涉及到索引,我理解的索引就是一種數據結構,mysql中常用的數據結構有Hash索引,B+樹索引結構,
Hash索引,它的有點在於時間複雜度讀O(1),但是它有其缺點,不能進行範圍查找操作,
B+樹數據結構,它沒有紅黑樹樹高高,針對覆蓋索引,子葉節點存放行數據,非覆蓋索引子葉節點存放的是主鍵索引位置信息,需要回表查詢數據
關於創建角度
- 創建最好採用覆蓋索引,這樣可以直接獲取行數據不需要進行回表查詢,可以採用EXPLAIN命令執行sql,Extra字段是using index condition 說明使用的是覆蓋所有
- 其次,mysql存儲是在磁盤中,磁盤存放是無序的,IO消耗是很嚴重的,索引我們可以打開Mrr設置,目的是讓在回表查詢之前將id緩存起來進行排序,減少IO消耗。
關於索引失效
- 是否使用函數,例如String 存放id內部進行隱式轉化cast()導致所有失效
- 多張表編碼是否一致
- 是否遵循複合索引的最左原則
- like 以%開頭,索引無效;當like前綴沒有%,後綴有%時,索引有效
- or語句前後沒有同時使用索引。當or左右查詢字段只有一個是索引,該索引失效,只有當or左右查詢字段均爲索引時,纔會生效
- 在索引列上使用 IS NULL 或 IS NOT NULL操作。索引是不索引空值的,所以這樣的操作不能使用索引,可以用其他的辦法處理,例如:數字類型,判斷大於0,字符串類型設置一個默認值,判斷是否等於默認值即可。
- 在索引字段上使用not,<>,!=。不等於操作符是永遠不會用到索引的,因此對它的處理只會產生全表掃描。 優化方法: key<>0 改爲 key>0 or key<0
索引使用不上
可以臨時採用強制索引,force index