mysql開發規範
阿新 • • 發佈:2017-11-07
ber where not in 字符串 數學運算 體積 減少 偏移量 根據
1:庫表設計
- 庫名、表名、字段名采用小寫字母,並采用下劃線分割;對相關功能的表應該使用相同的前綴,如member_xxx,前綴通常為庫名或依賴主實體對象;
- 所有的表以及字段都必須有備註、詳細說明表以及字段的含義
- 涉及貨幣金額或其他精度敏感的數據必須使用定點數Decimal來替代float和double
- 庫名、表名、字段名禁止使用mysql保留字,如data、like、desc等
- 控制表字段數,單表不超過50個純int/20個varchar(10)字段等同存儲體積的字段數,上限控制在20~50
2:索引設計
基本規則:索引不是越多越好,能不添加索引盡量不添加索引,過多的索引會嚴重降低插入和更新的效率,並帶來讀寫沖突和死鎖
- 索引名稱必須使用小寫,普通索引按照idx_字段名_字段名[_字段名]進行命名,唯一索引按照 uniq_字段名_字段名[_字段名]進行名
- 表必須有主鍵,推薦使用獨立業務的AUTO_INCREMENT列或全局ID生成器做主鍵,禁止使用多字段做聯合主鍵
- 不使用UUID/MD5/HASH等函數生成無規則值做主鍵,效率極差
- 索引數量控制
- 單張表中索引數量不超過5個
- 單個索引中的字段數不超過5個
- 對字符串使用前綴索引,索引長度不超過10個字符
- 索引字段的順序需要考慮每個字段去重以後的數量,區分度最大的[個數最多的]放在前面
- 合理創建聯合索引(避免冗余),符合最左前綴原則:(a,b,c)相對於(a)、(a,b)、(a,b,c)
- 可能需要添加索引的字段
- Order by,group by,distinct的字符按需要添加在索引的後面
- update,delete語句需要根據where條件添加索引
- 對於join操作,需要join字段上添加索引
- 索引使用禁忌
- 不使用%前導的查詢,如like ‘%ab’
- 不使用負向查詢,如 not in/not lilke/<>
- 不在區分度的列上建立索引,如性別
- 不在索引列進行數學運算和函數運算
示例:假設在表table中id建立索引
- select col_A,col_B from table where id+1>100 不會使用索引
- select col_A,col_B from table where id>100+1 會使用索引
3:sql優化
- 線上盡量少使用 大sql,可能一條大sql就把整個數據庫堵死,將復雜sql拆分為多條簡單的sql,化繁為簡
- 一條sql只能在一個cpu運算,如果sql比較復雜執行效率會非常低
- 簡單sql緩存命中率更高
- 減少鎖表時間
- 充分利用多核cpu,提高並發效率
- 減少mysql端的數學運算和邏輯判斷,避免sql語句出現md5()、order by rand()等
- 過濾表記錄合並不去重的情況,改寫union為union all
- 減少使用拼接sql,使用預編譯語句,降低sql註入的概率
- where 條件中的非等值條件(in between < <= > >=)會導致使用不了聯合索引的後續字段,註意避免
- where條件比較,字段類型和傳入值必須保持類型一直,避免隱式轉換
示例
字段:code varchar(50) not null coment ‘編碼‘ #code 上建立了索引
- select * from table_name where code=10001;不會使用索引
- select * from table_name where code=‘10001‘;會使用索引
- Limit 分頁優化
- 傳統分頁
select * from table limit 1000,10
limit原理:
LIMIT 接受一個或兩個數字參數。參數必須是一個整數常量。如果給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目
limit 1000,10//檢索記錄行1001-1010,偏移量越大則越慢
- 推薦分頁
- 分頁方式1:
Select * from table WHERE id >= ( select id from table limit 10000,1 ) limit 10;
id是主鍵查詢的速度比較快
- 分頁方式2:
-
程序取ID: Select id from table limit 10000,10;
-
Select * from table WHERE ID in(123,456…);
mysql開發規範