mysql的in查詢與union all 查詢

2021-07-24 21:31:35 字數 1604 閱讀 3597

mysql會對sql語句做優化, in 後面的條件不超過一定數量仍然會使用索引。

mysql 會根據索引長度和in後面條件數量判斷是否使用索引。

另外,如果是in後面是子查詢,則不會使用索引。

乙個文章庫,裡面有兩個表:category和article。category裡面有10條分類資料。article裡面有 20萬條。article裡面有乙個"article_category"欄位是與category裡的"category_id"字段相對應的。 article表裡面已經把 article_category字義為了索引。資料庫大小為1.3g。

問題描述:

執行乙個很普通的查詢:

select * from `article` where article_category=11 order by article_id desc limit 5 

//執行時間大約要5秒左右

解決方案:

建乙個索引:

create index idx_u on article (article_category,article_id);

select * from `article` where article_category=11 order by article_id desc limit 5

減少到0.0027秒

繼續問題:

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

執行時間要11.2850秒。

(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

使用or:

select * from article

where article_category=2

or article_category=3

order by article_id desc

limit 5

解決方案:避免使用in 或者 or (or會導致掃表),使用union all

使用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

SQL查詢中的UNION ALL和UNION區別

和union all 的重要的區別關於對重複結果的處理。union 在合併子查詢重複的記錄只保留一條,而 union all 並不合併子查詢的重覆記錄。現舉例說明它們之間的區別。示例1 查詢職位為 clerk 員工資訊。sql select empno,ename,job deptno from e...

mysql離散查詢 MySQL多表查詢與子查詢

多表查詢 多表查詢實際上根據查詢要求先將兩個表連線起來,形成一張新錶,再在新錶中查詢出滿足條件的記錄多表查詢可分為連線查詢和子查詢。a 左外連線包括兩個表中滿足條件的行,再加上在join子句中指出的左表中不滿足的行。b 不滿足鏈結條件的行在結果中顯示為null c.全外連線中參加連線的兩個表中的每一...

MYSQL查詢與優化

sql查詢關聯兩個資料表,乙個是攻擊ip使用者表主要是記錄ip的資訊,如第一次攻擊時間,位址,ip等等,乙個是ip攻擊次數表主要是記錄每天ip攻擊次數。而需求是獲取某天攻擊ip資訊和次數。以下sql語句測試均在測試伺服器上上,正式伺服器的效能好,查詢時間快不少。檢視表的行數 未優化前sql語句為 s...