降低業務耦合度,SQL語句盡可能簡單 大SQL語句盡可能拆成小SQL語句,MySQL對複雜SQL支援不好。
禁止使用觸發器、函數、存儲過程。
避免在資料庫中進行數學運算
避免使用select *,需要查詢哪幾個字段就select這幾個字段
IN()裡面的資料個數建議控制在 500 以内,可以用exist代替in,exist在某些場景比in效率高,盡量不使用not in
limit分頁注意效率。limit越大,效率越低。可以改寫limit,例如: select id from test - limit 10000,10 可以改寫為 select id from test where id > 10000 limit 10
當隻要一行資料時使用LIMIT 1 。
擷取大量資料時,建議分批次擷取資料,每次擷取資料少于 10000 條,結果集應小于1M
避免使用大表做 JOIN,使用group by分組、自動排序
SQL語句禁止出現隐式轉換,例如:select id from test where id=’1’,其中 id 列為 int 等數字類型。
避免核心業務流程SQL包含:計算操作、多表關聯、表周遊case when等複雜查詢,建議拆分成單表簡單查詢
OR 條件: f_phone=’10000’ or f_mobile=’10000’,兩個字段各自有索引,但隻能用到其中一個。可以拆分成2個sql,或者union all
用UNION ALL代替UNION:UNION ALL不需要對結果集再進行排序
任何新的select,update,delete上線,都要先explain,看索引使用情況。盡量避免extra列出現:Using File Sort,Using Temporary;rows超過1000的要謹慎上線
杜絕危險SQL
比如:update/delete禁止使用where 1=1 這樣無意義或恒真的條件,以防遇到sql注入
比如:SQL中不允許出現DDL語句,一般也不給予create/alter這類權限
DDL語句中盡量避免drop表,應先備份再删除
資料更新時
對同一個表的多次alter操作必須合并為一次操作
Mysql對表的修改絕大部分操作都需要鎖表并重建表,而鎖表則會對線上業務造成影響。
INSERT語句使用batch送出,values的個數不超過500
減少與資料庫互動次數,盡量采用批量SQL語句