最近閱讀了一些阿里發出的索引規約手冊,記錄下
一、建表規約
1,表達是與否概念,使用is_xxx方式命名,數據類型爲unsignde tinyint
2, 表名,字段名使用小寫字母
3,不要用保留字
4,唯一索引使用uk_字段名;普通索引使用idx_字段名
5,小數類型使用decimal,不要用float和double
6,存儲字符串長度相同,使用char
7,varchar是變長字符串,不預先分配存儲空間,如果長度過大使用text,獨立出一張表使用主鍵對應,避免影響其他字段索引
8,表名最好加上業務名稱_表作用
9,庫名與應用名一致
10,字段可以適當冗餘,但要考慮數據同步,冗餘字段不是頻繁修改字段,不是長字段
11,單表超過500晚或者2GB,才考慮吧分庫分表
12,合適的字符串長度,可以節約數據庫表空間,節約索引存儲,能提升檢索速度
二、索引規約
1,業務上具有唯一特性的字段,即使是組合字段,也要建成唯一索引
說明:唯一索引影響inster速度可以忽略,但查找速度提升是很明顯的,即使在應用層做了判斷,沒有唯一索引,跟據墨菲定律,也必然會有髒數據產生
2,超過三個表的join,禁止使用join
3,varchar字段建立索引時,必須指定索引長度
說明:索引的長度與區分度是一對矛盾體,一般對字符串類型數據,長度爲 20 的索引,區分
度會高達 90%以上,可以使用 count(distinct left(列名, 索引長度))/count(*)的區分度
來確定。
4,不要使用左模糊或者全模糊查詢
說明:索引文件具有B-TREE的最左匹配特性,左邊的值未確定,就無法使用索引
5,使用order by 注意使用索引的有序性。最後的字段是組合索引的一部分,並且放在索引組合順序的最後
例:where a=? and b= ? order by c ;索引 : a_b_c
6,利用覆蓋索引來進行查詢操作,避免回表操作
7,利用延遲關聯或者子查詢優化超多分頁場景
說明:快速定位需要獲取的id段,然後關聯
SELECT a.* FROM 表 1 a, (select id from 表 1 where 條件 LIMIT 100000,20 ) b where a.id=b.id
8,sql優化目標至少range級別,要求ref級別,最好 consts
說明 :consts 單表中最多隻有一個匹配行(主鍵或者唯一索引),在優化階段即可讀取到數據。ref 指的是使用普通的索引(normal index)。range 對索引進行範圍檢索。
9,建立組合索引時,區分度最高的在最左邊