你這涉及到union all,or 和in 及索引字段的,,,,
專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)改則免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了近1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
1、對于索引列來最好使用union all,因復(fù)雜的查詢【包含運(yùn)算等】將使or、in放棄索引而全表掃描,除非你能確定or、in會使用索引。
2、對于只有非索引字段來說你就老老實(shí)實(shí)的用or 或者in,因?yàn)?非索引字段本來要全表掃描而union all 只成倍增加表掃描的次數(shù)。
3、對于及有索引字段【索引字段有效】又包含非索引字段來時,按理你也使用or 、in或者union all 都可以,但是我推薦使用or、in。
上面都說的是單表的情況,所以你這個問題你給出語句信息,
并不能簡單的說誰比in快的,,,,要看索引字段情況的
也不知道你指的是什么數(shù)據(jù)庫,對于常用的mysql,sqlserver,oracle 來說in 不是函數(shù)而是一個范圍運(yùn)算的關(guān)鍵字,多數(shù)在建立約束和對表進(jìn)行select,update,delete 操作時候進(jìn)行一個約束限制和查詢,更新,刪除的篩選限制。
比如對表users進(jìn)行查詢操作使用in 關(guān)鍵字實(shí)現(xiàn)條件限制:
1 select userName from users where address in ('北京','長春','長沙');
2 select username from users where age in (18,19,20); 等等。
如果要使用其他手段來代替in 這要根據(jù)具體需求來考慮了,如第2條語句可以這樣寫:
select username from users where age=18 or age=19 or age=20;
select username from users where age between 18 and 20;
有時也可以使用 not in 從邏輯反實(shí)現(xiàn)in 的功能...............
............
mysql百萬數(shù)據(jù)查詢用exists 代替 in 是一個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)
SQL查詢語句優(yōu)化方法:
1、應(yīng)盡量避免在 where 子句中使用!=或操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描。
2、對查詢進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索引。
3、應(yīng)盡量避免在 where 子句中對字段進(jìn)行 null 值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:
select id from t where num is null
可以在num上設(shè)置默認(rèn)值0,確保表中num列沒有null值,然后這樣查詢:
select id from t where num=0
4、盡量避免在 where 子句中使用 or 來連接條件,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:
select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20
5、下面的查詢也將導(dǎo)致全表掃描:(不能前置百分號)
select id from t where name like ‘%c%’
若要提高效率,可以考慮全文檢索。