目錄
文章目錄
前言sql語句優化
一、in和exists哪個效率高
in 和exists
not in 和not exists
二、查詢條件哪個在前哪個在後
三、sql優化之如何改造or
總結
sql優化實戰筆記
先看這兩條sql,哪個效率更高呢?
select * from t_a a where a.id in (select id from t_b b where b.name=#);
select * from t_a a where exists (select id from t_b b where b.name=# and a.id=b.id)
in是把外表和內錶作hash 連線,而exists 是對外表作loop 迴圈,每次loop 迴圈再對內表進行查詢。
一直以來認為exists 比in 效率高的說法是不準確的。如果查詢的兩個表大小相當,那麼用in 和exists 差別不大。、
如果兩個表中乙個較小,乙個是大表,則子查詢表大的用exists,子查詢錶小的用in:
如果查詢語句使用了not in 那麼內外表都進行全表掃瞄,沒有用到索引;
而not extsts 的子查詢依然能用到表上的索引。所以無論那個表大,用not exists 都比not in 要快。
這個問題要考慮兩方面的因素,
1、根據聯合索引的前後順序,盡量使用的鎖索引,能全用上肯定最好
2、把最能過濾資料的條件放在前面
條件中加這個or會導致索引的失效,當然就會使得查詢效率的大幅下降
我們可以使用union或者union all來改造sql
注釋:union:去掉重複的;union all:不去掉重複的
select * from t_a a where a.id = '1' or a.id = '2' or a.name = 'zhang';
select * from t_a a where a.id = '1'
union
select * from t_a a where a.id = '2'
union
select * from t_a a where a.name = 'zhang';
僅做參考,所有修改後的sql都要經過自己實際的執行才能的到結論,切不可紙上談兵
sql優化筆記
一 資料庫內連線原理 在sql server中,我們所常見的表與表之間的inner join,outer join都會被執行引擎根據所選的列,資料上是否有索引,所選資料的選擇性轉化為loop join,merge join,hash join這三種物理連線中的一種。1.oracle的表連線hash ...
sql 優化筆記
mysql 原文 原文這裡的引數為list,這裡我用的,分割的字串 思路就是將in中的資料處理成乙個表,進行表的關聯查詢 替換掉in select fm.id,fm.configuration id,fm.name code,fm.manufactor code,fm.type,fm.is sign...
SQL優化的筆記
一般使用sql的時候你是不會去想到優化。但是面對乙個有sql效能問題的資料庫時,我們應該如何入手進行系統的分析,使得能夠盡快定位問題sql,並且盡快解決問題。1.使用show status 命令了解各種sql的執行頻率 引用例如在mysql的cline上輸入 show status like com...