亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL中使用or、in與union all在查詢命令下的效率對比

2024-07-24 13:08:33
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了MySQL中使用or、in與union all在查詢命令下的效率對比,論證了在通常情況下union all并不一定比or及in更快,需要的朋友可以參考下
 

OR、in和union all 查詢效率到底哪個快?
網上很多的聲音都是說union all 快于 or、in,因為or、in會導致全表掃描,他們給出了很多的實例。
但真的union all真的快于or、in?

EXPLAIN SELECT * from employees where employees.first_NAME ='Georgi' UNION ALL SELECT * from employees where employees.first_NAME ='Bezalel'

這條語句執行結果481條,執行時間為0.35s

PRIMARY employees ALL 300141 Using whereUNION employees ALL 300141 Using where UNION RESULT <union1,2> ALL explain SELECT * FROM employees WHERE employees.first_name IN ('Georgi','Bezalel')

這條語句的執行結果時間為0.186s

SIMPLE  employees  ALL  300141  Using whereexplain SELECT * FROM employees WHERE employees.first_name ='Georgi' or employees.first_name='Bezalel'

這條語句的執行結果和in的結果差不多

難道是網上的說法有誤?難道和索引有關?在firstname上建立了一個索引

重新執行

union的執行執行計劃如下,執行時間為0.004s

PRIMARY  employees  ref  index_firstname  index_firstname  44  const  253  Using whereUNION  employees  ref  index_firstname  index_firstname  44  const  228  Using whereUNION RESULT  <union1,2>  ALL  

in的執行計劃如下,執行時間也為0.004s

SIMPLE  employees  range  index_firstname  index_firstname  44  481  Using where

or的執行計劃如下,執行時間也為0.004s

SIMPLE  employees  range  index_firstname  index_firstname  44  481  Using where

感覺性能差不多啊。但是注意執行計劃中的type,ref要好于range哦(ref為非唯一性索引掃描,range為索引范圍掃描)
突然感覺好像和網上說的差不多了,但是第一個語句走了兩個ref掃描 會不會效率比走一次range的掃描低啊。

要不我再試試主鍵,這個是唯一的,會不會和網上的效果一直呢?

EXPLAIN SELECT * FROM employees WHERE employees.EMP_NO=100001 UNION ALL SELECT * FROM employees WHERE employees.EMP_NO=101100

union的執行計劃如下

PRIMARY  employees  const  PRIMARY  PRIMARY  4  const  1  UNION  employees  const  PRIMARY  PRIMARY  4  const  1  UNION RESULT  <union1,2>  ALL  EXPLAIN SELECT * FROM employees WHERE employees.EMP_NO IN (100001 ,101100)

in的執行計劃如下

SIMPLE  employees  range  PRIMARY  PRIMARY  4  2  Using whereEXPLAIN SELECT * FROM employees WHERE employees.EMP_NO=100001 OR emp_no=101100

or的執行計劃如下

SIMPLE  employees  range  PRIMARY  PRIMARY  4  2  Using where

感覺結果和第二個實驗還是差不多。


下面本文就采用實例來探討在實際的查詢命令下它們之間的效率對比究竟如何。
1:創建表,插入數據、數據量為1千萬【要不效果不明顯】。

drop table if EXISTS BT; create table BT(   ID int(10) NOT NUll,   VName varchar(20) DEFAULT '' NOT NULL,   PRIMARY key( ID ) )ENGINE=INNODB; 

 該表只有兩個字段 ID為主鍵【索引頁類似】,一個是普通的字段。(偷懶就用簡單的表結構呢)
向BT表中插入1千萬條數據
這里我寫了一個簡單的存儲過程【所以你的mysql版本至少大于5.0,俺的版本為5.1】,代碼如下。
注意:最好

  INSERT INTO BT ( ID,VNAME ) VALUES( i, CONCAT( 'M', i ) );---1

    修改為

  INSERT INTO BT ( ID,VNAME ) VALUES( i, CONCAT( 'M', i, 'TT' ) );---2

   修改原因在
   非索引列及VNAME使用了聯合進行完全掃描請使用1 。
   非索引列及VNAME使用了全表掃描請使用2 。
 

DROP PROCEDURE IF EXISTS test_proc; CREATE PROCEDURE test_proc() BEGIN declare i int default 0; set autocommit = 0; while i<10000000 do INSERT INTO BT ( ID,VNAME ) VALUES( i, CONCAT( 'M', i ) ); set i = i+1; if i%2000 = 0 then commit; end if; end while; END; 

 就不寫注釋呢,挺簡單的。
存儲過程是最好設置下innob的相關參數【主要和日志、寫緩存相關這樣能加快插入】,俺沒有設置插入1千萬條數據插了6分鐘。
部分數據如下:1千萬數據類似

MySQL中使用or、in與union all在查詢命令下的效率對比

2:實戰
    2.1 :分別在索引列上使用 or、in、union all
           我們創建的表只有主鍵索引,所以只能用ID做查詢呢。我們查 ID 為 98,85220,9888589的三個數據各個耗時如下:

MySQL中使用or、in與union all在查詢命令下的效率對比

時間都為0.00,怎么會這樣呢,呵呵所有查詢都是在毫秒級別。
我使用其他的工具--EMS SQL Manager  for mysql
查詢顯示時間為
93 ms, 94ms,93 ms,時間相差了多少幾乎可以忽略。
然后我們在看看各自的執行計劃

MySQL中使用or、in與union all在查詢命令下的效率對比

這里要注意的字段type 與ref字段
我們發現union all 的所用的 type【type為顯示連接使用了何種類型】 為ref 而or和in為range【ref連接類型優于range,相差不了多少】,而查詢行數都一樣【看rows字段都是為3】。
從整個的過程來看,在索引列使用常數or及in和union all查詢相差不了多少。
但為什么在有的復雜查詢中,再索引列使用or及in 比union all 速度慢很多呢,這可能是你的查詢寫的不夠合理,讓mysql放棄索引而進行全表掃描。
2.2:在非索引列中使用 or、in及union all。
    我們查 VNAME 為 M98,M85220,M9888589的三個數據各個耗時如下:

MySQL中使用or、in與union all在查詢命令下的效率對比

我們發現為啥union all查詢時間幾乎為 or 和in的三倍。
這是為什么呢,我們先不說,先看看三個的查詢計劃。

MySQL中使用or、in與union all在查詢命令下的效率對比

這里我們發現計劃幾乎一樣。
但我們要注意掃描的此時對于 or及in 來說 只對表掃描一次即rows是列為9664782。
而對于union all 來說對表掃描了三次即rows的和為9664782*3。
這也是為什么我們看到union all 為幾乎為三倍的原因。
備注: 如果使用存儲過程使用第二sql該執行計劃所有的type列 為 all,其實這個是我最想演示的,但現在已經快寫完畢了才發現問題將錯就錯呢。

3:總結
     3.1:不要迷信union all 就比 or及in 快,要結合實際情況分析到底使用哪種情況。
     3.2:對于索引列來最好使用union all,因復雜的查詢【包含運算等】將使or、in放棄索引而全表掃描,除非你能確定or、in會使用索引。
    3.3:對于只有非索引字段來說你就老老實實的用or 或者in,因為 非索引字段本來要全表掃描而union all 只成倍增加表掃描的次數。
    3.4:對于及有索引字段【索引字段有效】又包含非索引字段來時,按理你也使用or 、in或者union all 都可以,
       但是我推薦使用or、in。
      如以下查詢:

select * from bt where bt.VName = 'M98' or bt.id ='9888589'  select * from bt where bt.VName = 'M98' UNION ALL select * from bt where bt.id = '9888589' 

     該兩個查詢速度相差多少 主要取決于 索引列查詢時長,如索引列查詢時間太長的話,那你也用or或者in代替吧。
   3.5: 以上主要針對的是單表,而多表聯合查詢來說,考慮的地方就比較多了,比如連接方式,查詢表數據量分布、索引等,再結合單表的策略選擇合適的關鍵字。 



注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日产欧美a一级在线| 欧美野外wwwxxx| 久久久久久欧美| 国产精品国产亚洲伊人久久| 欧美精品在线视频观看| 国产免费一区二区三区香蕉精| 欧美有码在线视频| 亚洲成人xxx| 在线观看亚洲视频| 一区二区成人av| 精品久久久久久久久久久久久| 91精品国产高清久久久久久91| 国产午夜精品全部视频在线播放| 久久综合久中文字幕青草| 欧美在线视频播放| 亚洲第一区中文字幕| 欧美黑人巨大xxx极品| 77777少妇光屁股久久一区| 日韩精品中文字幕有码专区| 亚洲激情在线观看| 国产精品情侣自拍| 成人欧美一区二区三区黑人孕妇| 国产激情久久久久| 91精品国产乱码久久久久久久久| 亚洲精品在线观看www| 久久久久久成人| 神马久久久久久| 色噜噜狠狠狠综合曰曰曰88av| 亚洲在线免费视频| 亚洲福利精品在线| 欧美专区日韩视频| 国产亚洲精品久久久久久牛牛| 国产精品第一页在线| 日韩经典中文字幕在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美精品久久久久久久| 国产精品一区二区女厕厕| 8x海外华人永久免费日韩内陆视频| 精品性高朝久久久久久久| 亚洲精品mp4| 国产精品成人久久久久| 久久视频在线视频| 国产亚洲精品高潮| 亚洲天堂视频在线观看| 国产精品福利在线观看| 国产精品美女久久| 在线观看中文字幕亚洲| 国产精品国产三级国产专播精品人| 亚洲图片欧美日产| 久久久久国产精品免费网站| 亚洲成人精品视频| 欧美视频一二三| 日韩av在线播放资源| 欧美美女操人视频| 911国产网站尤物在线观看| 久久久久久久国产精品| 日韩av一区二区在线观看| 国产精品久久久久久av福利| 国产精品在线看| 在线免费观看羞羞视频一区二区| 欧美成人国产va精品日本一级| 欧美日韩福利在线观看| 日韩有码在线播放| 亚洲欧洲日本专区| 97香蕉超级碰碰久久免费的优势| 国产精品视频中文字幕91| 国产日韩在线免费| 亚洲情综合五月天| 欧美精品电影在线| 色先锋资源久久综合5566| 亚洲www在线观看| 国产91精品在线播放| 国产在线观看一区二区三区| 亚洲欧美激情四射在线日| 97视频在线观看播放| 亚洲一区免费网站| 97av在线视频免费播放| 亚洲视频在线观看视频| 国产精品激情av在线播放| 日韩成人激情在线| 成人在线视频网站| 欧美亚洲日本黄色| 亚洲bt天天射| 中文字幕亚洲无线码在线一区| 欧美一区第一页| 日韩av电影手机在线观看| 久久久亚洲影院你懂的| 粉嫩av一区二区三区免费野| 92裸体在线视频网站| 精品动漫一区二区三区| 色婷婷综合久久久久中文字幕1| 久热精品视频在线| 欧美一级片在线播放| 欧美日韩一区二区免费视频| 国产日韩欧美在线看| 久久伊人免费视频| 91美女福利视频高清| 国产精品久久久久久久电影| 成人久久久久久久| 日韩专区中文字幕| 亚洲精品一区二区三区不| 欧美视频在线视频| 久久久精品2019中文字幕神马| 久久亚洲国产精品| 亚洲欧美在线免费观看| 亚洲国产成人精品女人久久久| 欧美日韩在线视频一区二区| 欧美另类精品xxxx孕妇| 欧美日韩ab片| 欧洲一区二区视频| 日本最新高清不卡中文字幕| 成人美女av在线直播| 亚洲电影天堂av| 色综合久久中文字幕综合网小说| 亚洲视频视频在线| 日韩av在线网站| 久久亚洲精品中文字幕冲田杏梨| 日韩有码片在线观看| 国产精品美女免费视频| 亚洲字幕一区二区| 日本伊人精品一区二区三区介绍| 亚洲天堂av女优| 91久久精品日日躁夜夜躁国产| 5278欧美一区二区三区| 5566日本婷婷色中文字幕97| 国产啪精品视频| 狠狠色香婷婷久久亚洲精品| 一区二区三区精品99久久| 操91在线视频| 欧美极品在线视频| 九九久久久久久久久激情| 欧美成人午夜激情在线| 久久久久日韩精品久久久男男| 欧美日韩国产综合视频在线观看中文| 欧美激情一区二区三区高清视频| 欧美性受xxx| 日本视频久久久| 国产精品欧美激情在线播放| 久久精品视频在线| 在线播放亚洲激情| 色婷婷av一区二区三区在线观看| 国产亚洲美女久久| 亚洲欧美在线免费| 日韩精品在线观看一区| 国产成人午夜视频网址| 欧美精品久久一区二区| 亚洲成人黄色网| 在线观看日韩欧美| 两个人的视频www国产精品| 国产精品女人久久久久久| 欧美电影免费观看大全| 亚洲自拍偷拍视频| 国产91精品久| 日av在线播放中文不卡| 成人免费观看网址| 欧美午夜视频一区二区| 美日韩精品免费视频| 亚洲精品国产精品国自产观看浪潮| 亚洲自拍在线观看| 中文字幕av日韩| 日韩有码在线视频| 亚洲午夜国产成人av电影男同| 欧美高清一级大片| 91久久国产婷婷一区二区|