mysql索引優化以及建表規約

最近閱讀了一些阿里發出的索引規約手冊,記錄下

 

一、建表規約


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,建立組合索引時,區分度最高的在最左邊

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章