union in or查詢效率及index

2021-08-26 16:21:01 字數 1626 閱讀 7263

union 用於合併兩個或多個查詢結果,這些查詢結果必須具備相同的列結構、相同的列順序。

union:

select column_names from tablename

union

select column_names from tablename

union all:

select column_names from tablename

union all

select column_names from tablename

union與union all的區別在於union

在進行表鏈結後會篩選掉重複的記錄,所以在表鏈結後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。

sql在執行時先取出兩個表的結果,再用排序空間進行排序並會掉刪除重複的記錄,最後返回結果集,如果表資料量大的話可能會導致用磁碟進行排序。

而union all只是簡單的將兩個結果合併後就返回,這樣,如果返回的兩個結果集中有重複的資料,那麼返回的結果集就會包含重複的資料了。

從效率上說,union all比union會快很多,如果確定兩個表中不包含重複資料的話就用union all。

有些時候會不可避免的用到in與or進行查詢。但使用時需要注意使用in或or查詢會進行資料遍歷,會影響查詢效率。

sql:

select * from article where article_category=11 order by article_id desc limit 5
優化此sql效率,建立索引:

create index idx_u on article (article_category,article_id);

in:

select * from article where article_category in (2,3) order by article_id desc limit 5
or:

select * from article where article_category=2 or article_category=3 order by article_id desc limit 5
此時已經做了列索引但查詢效率依舊不高。

union all:

(select * from article where article_category=2 order by article_id desc limit 5) 

union all (select * from article where article_category=3 order by article_id desc limit 5)

order by article_id desc

limit 5

1.對於索引列來最好使用union all,因複雜的查詢【包含運算等】將使or、in放棄索引而全表掃瞄,除非你能確定or、in會使用索引。

2.對於只有非索引字段來說你就老老實實的用or 或者in,因為 非索引字段本來要全表掃瞄而union all 只成倍增加表掃瞄的次數。

PHP中的i 與 i的區別及效率

先看看基本區別 i 先在i所在的表示式中使用i的當前值,後讓i加1 i 讓i先加1,然後在i所在的表示式中使用i的新值 i相當於下列 i 1 return i i 相當於下列 j i i 1 return j 當然如果編譯器會將這些差別都優化掉,那麼效率就都差不多了。再給大家詳細說下 i 與 i 的...

i 與 i效率比較

1.對於i是內建型別,效率無差別,編譯器會自動優化 2.對於i為非內建型別,效率會存在不同,主要體現在其功能作用不同,i是將i值自增後返回,而i 是返回 i 的臨時變數,同時將i自增。可以猜想其過載操作符實現邏輯與下面 類似 classname classname operator classnam...

寫有效率的SQL查詢(I)

1.1where條件的列上都得有統計資訊。沒統計資訊sqlserver就無法估算不同查詢計畫開銷優劣,而只能採用最穩妥的scan 不管是table scan還是clustered index scan 一般情況下我們不會犯這種錯誤 where條件裡不使用非索引列是個常識。索引上的統計資訊是無法刪除的...