SQL語句最佳化 -- 以Mysql為例

來源:互聯網
上載者:User

標籤: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為例

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.