天天看點

MySQL—— MySQL的索引最佳實踐

1、測試表

2、最佳實戰

2.1、全值比對

2.2、最左字首法則

2.3、不在索引列上做任何操作(計算、函數、(自動or手動)類型轉換),會導緻索引失效而轉向全表掃描

2.4、存儲引擎不能使用索引中範圍條件右邊的列

2.5、盡量使用覆寫索引(隻通路索引的查詢(索引列包含查詢列)),減少 select * 語句

2.6、mysql在使用不等于(!=或者<>),not in ,not exists 的時候無法使用索引會導緻全表掃描< 小于、 > 大于、 <=、>= 這些,mysql内部優化器會根據檢索比例、表大小等多個因素整體評估是否使用索引

2.7、is null,is not null 一般情況下也無法使用索引

2.8、like以通配符開頭('$abc...')mysql索引失效會變成全表掃描操作

2.9、字元串不加單引号索引失效

2.10、少用or或in,用它查詢時,mysql不一定使用索引,mysql内部優化器會根據檢索比例、表大小等多個因素整體評估是否使用索引,詳見範圍查詢優化

2.11、範圍查詢優化

3、總結

MySQL—— MySQL的索引最佳實踐
MySQL—— MySQL的索引最佳實踐
MySQL—— MySQL的索引最佳實踐
如果索引了多列,要遵守最左字首法則。指的是查詢從索引的最左前列開始并且不跳過索引中的列
MySQL—— MySQL的索引最佳實踐
MySQL—— MySQL的索引最佳實踐
MySQL—— MySQL的索引最佳實踐
我們可以發現,隻有第一個可以打到索引上
MySQL—— MySQL的索引最佳實踐

給hire_time增加一個普通索引:

MySQL—— MySQL的索引最佳實踐

轉化為日期範圍查詢,有可能會走索引:

MySQL—— MySQL的索引最佳實踐

還原最初索引狀态

MySQL—— MySQL的索引最佳實踐
MySQL—— MySQL的索引最佳實踐
MySQL—— MySQL的索引最佳實踐
MySQL—— MySQL的索引最佳實踐
MySQL—— MySQL的索引最佳實踐
MySQL—— MySQL的索引最佳實踐
MySQL—— MySQL的索引最佳實踐
MySQL—— MySQL的索引最佳實踐

問題:解決like’%字元串%'索引不被使用的方法?

a)使用覆寫索引,查詢字段必須是建立覆寫索引字段

MySQL—— MySQL的索引最佳實踐

b)如果不能使用覆寫索引則可能需要借助搜尋引擎

MySQL—— MySQL的索引最佳實踐
MySQL—— MySQL的索引最佳實踐
MySQL—— MySQL的索引最佳實踐

給年齡添加單值索引

MySQL—— MySQL的索引最佳實踐

沒走索引原因:mysql内部優化器會根據檢索比例、表大小等多個因素整體評估是否使用索引。比如這個例子,可能是由于單次資料量查詢過大導緻優化器最終選擇不走索引

優化方法:可以将大的範圍拆分成多個小範圍

MySQL—— MySQL的索引最佳實踐
MySQL—— MySQL的索引最佳實踐
MySQL—— MySQL的索引最佳實踐

like kk%相當于=常量,%kk和%kk% 相當于範圍

‐‐ mysql5.7關閉only_full_group_by報錯

繼續閱讀