sql優化實戰筆記

2021-10-25 18:50:10 字數 1227 閱讀 9571

目錄

文章目錄

前言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...