1. 程式人生 > >sql 優化方法

sql 優化方法

沒有 tran 微軟雅黑 normal summary 需要 auto splay hit

(1)Where子句中:where表之間的連接必須寫在其他Where條件之前,那些可以過濾掉最大數量記錄的條件必須寫在Where子句的末尾.HAVING最後。--- 需要按照順序進行一級一級的篩選

(2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。

    exists 條件 返回的 是boolean型 只有 true 或者 false; 所以在exists 中的id 條件 應該是 外查詢的查詢id

    SELECT * FROM alumni_info t WHERE EXISTS(SELECT a_id FROM alumni_education e WHERE t.id

_=‘6588‘ ),

  xeg:SELECT * FROM alumni_info t WHERE EXISTS(SELECT a_id FROM alumni_education e WHERE e.a_id=‘6588‘ ),返回的結果跟SELECT * FROM alumni_info t一樣(a_id=6588存在),因為select語句先執行where條件後的語句,再篩選字段,當執行完where條件後,若這條結果集存在,則where表達式後面永遠都是true,否則為false。也就是說要麽查詢所有,要麽沒有數據。

    卡券項目中我想查詢卡券發行數量超過100張的卡券信息:   

    select * from wechatcarden wc where exists (select * from wechatcardsummary w where wc.id = w.weChatCardEnId

and skuQuantity>= 1000 )

等價於:select * from wechatcarden uw left join wechatcardsummary ws on uw.id = ws.weChatCardEnId where ws.skuQuantity >= 1000

(3) 避免在索引列上使用計算

(4)避免在索引列上使用IS NULL和IS NOT NULL

(5)對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。  

(6)應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描

(7)應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描

sql 優化方法