標籤:share art order by scene 多表 alt pos post src
本文參考下面的文章:
1: 【真·乾貨】MySQL 索引及最佳化實戰
2: Mysql語句的執行過程
3: sql最佳化的幾種方法
我將 sql語句最佳化分為三個方面,(此處不包括 商務邏輯的最佳化 和 緩衝的使用 ) : 索引最佳化 ; 關鍵字的使用 ; 有效規避 .
1: 索引的最佳化 可以分為 索引命中無效 的 最佳化 和 索引命中低效 的 最佳化 ;
1) : 索引命中無效的情況:
a : 如果是單列索引的話;最好不要出現null ; 據說是允許為null的話,可能會得到不符合預期的結果集;
b: 索引前置模糊 如: like"%xx";
c: 負向條件查詢 無法使用索引: 最佳化策略: 將負向條件最佳化為 in 查詢 ; 負向條件有: != , <> , not in , not exists , not like ;
d: 索引列 參與 計算 ;
e: 索引列 做強制轉換處理 ;
2) : 索引命中低效的情況:
a : 從效率上將: union > in > or ; 建議用 in ;
b : 聯合索引最左首碼原則 ;
c: 對於 order by 要利用索引的有效性:
2: 關鍵字的使用:
a : 用 exists 最佳化 in ; (呃 , 這裡我有個小疑問 , 上面說 將負面向條件查詢 最佳化成 in 以及 將 union , or 也最佳化成 in ; 這裡說 用 exists 來最佳化 in ; 那麼問題來了, 要不要 將上面用到in的地方 也使用 exists 最佳化一下呢? )
b : 用 instr() 函數 最佳化 like ;
instr(a , b ) > 0 <==> 從 a列中 尋找 like("%b%") ;
instr(a , b ) = 0 <==> 從 a列中 尋找 not like("%b%") ;
instr(a , b ) = 1 <==> 從 a列中 尋找 like("b%") ;
c : 超過三個表最好不要 join。
需要 join 的欄位,資料類型必須一致,多表關聯查詢時,保證被關聯的欄位需要有索引
3 : 有效規避 :
a: * 的使用;
盡量使用所有的列名,而不是* ;
b: union 與 union all
如果確定 使用 union 也不會產生 重複的記錄 ; 那就使用 union ; union 效率要高於 union all
c: 如果明確知道只有一條結果返回,limit 1 能夠提高效率。
d: 使用延遲關聯
e: 盡量使用數字型欄位:
SQL語句最佳化 -- 以Mysql為例