1. 【**強制**】業務上具有唯一特性的字段,即使是多個字段的組合,也必須建成唯一索引
說明:不要以為唯一索引影響了 insert 速度,這個速度損耗可以忽略,但提高查找速度是明顯的;另外,即使在應用層做了非常完善的校驗控制,只要沒有唯一索引,根據墨菲定律,必然有臟數據產生。
2. 【**強制**】超過三個表禁止 join。需要 join 的字段,數據類型必須絕對一致;多表關聯查詢時,保證被關聯的字段需要有索引
說明:即使雙表 join 也要注意表索引、SQL 性能。
3. 【強制】在 varchar 字段上建立索引時,必須指定索引長度,沒必要對全字段建立索引,根據實際文本區分度決定索引長度即可
說明:索引的長度與區分度是一對矛盾體,一般對字符串類型數據,長度為 20 的索引,區分度會高達 90%以上,可以使用 count(distinct left(列名, 索引長度))/count(\*)的區分度來確定。
4. 【推薦】如果有 order by 的場景,請注意利用索引的有序性。order by 最后的字段是組合索引的一部分,并且放在索引組合順序的最后,避免出現 file\_sort 的情況,影響查詢性能
正例:where a=? and b=? order by c; 索引:a\_b\_c
反例:索引中有范圍查找,那么索引有序性無法利用,如:WHERE a>10 ORDER BY b; 索引a\_b 無法排序。
5. 【推薦】利用覆蓋索引來進行查詢操作,避免回表
說明:如果一本書需要知道第 11 章是什么標題,會翻開第 11 章對應的那一頁嗎?目錄瀏覽一下就好,這個目錄就是起到覆蓋索引的作用。
正例:能夠建立索引的種類:主鍵索引、唯一索引、普通索引,而覆蓋索引是一種查詢的一種效果,用 explain 的結果,extra 列會出現:using index。
6. 【推薦】建組合索引的時候,區分度最高的在最左邊
正例:如果 where a=? and b=? ,a 列的幾乎接近于唯一值,那么只需要單建 idx\_a 索引即可。
說明:存在非等號和等號混合判斷條件時,在建索引時,請把等號條件的列前置。如:where a>? and b=? 那么即使 a 的區分度更高,也必須把 b 放在索引的最前列。
7. 【推薦】防止因字段類型不同造成的隱式轉換,導致索引失效;
8. 【參考】創建索引時避免有如下極端誤解:
1)寧濫勿缺。認為一個查詢就需要建一個索引。
2)寧缺勿濫。認為索引會消耗空間、嚴重拖慢更新和新增速度。
3)抵制惟一索引。認為業務的惟一性一律需要在應用層通過“先查后插”方式解決