精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MySQL:什么時候NOT IN不等于NOT EXISTS

數據庫 MySQL
當你想對兩個表進行差分運算時,你有兩種選擇:使用NOT EXISTS 的子查詢或者NOT IN 。后者可以說更易于編寫,可以使查詢方法更加明顯。現(xiàn)代數據庫系統(tǒng)可以優(yōu)化兩種執(zhí)行計劃從而查詢到類似的結果,可以在外部和內部處理查詢的相關性(我說“現(xiàn)代”,因為在上世紀90年代中期我已經吸取教訓,當時我正在使用Oracle 7.3,它沒有這個功能)。

[[195280]]

當你想對兩個表進行差分運算時,你有兩種選擇:使用NOT EXISTS 的子查詢或者NOT IN 。后者可以說更易于編寫,可以使查詢方法更加明顯。現(xiàn)代數據庫系統(tǒng)可以優(yōu)化兩種執(zhí)行計劃從而查詢到類似的結果,可以在外部和內部處理查詢的相關性(我說“現(xiàn)代”,因為在上世紀90年代中期我已經吸取教訓,當時我正在使用Oracle 7.3,它沒有這個功能)。

兩種結構有一個很大的不同:如果子查詢返回的結果為NULL,那么 NOT IN 的條件將不執(zhí)行,因為 NULL不等于它或不等于其它值。但是如果你注意到這一點,它們是等價的。事實上,這些消息告訴我們,NOT IN 查詢更快,人們更喜歡用它查詢。

這篇文章是關于一個數據庫顯著變慢的情況,而空值正是罪魁禍首。

考慮以下兩個可能是用來追蹤點擊流數據的表。由于我們跟蹤匿名和注冊用戶, EVENTS.USER_ID是可空的。然而,當用戶不空,二級指標標就會具有較高的基數。

  1. create table USERS 
  2.   ID    integer auto_increment primary key
  3.   ... 
  4.  
  5. create table EVENTS 
  6.   ID      integer auto_increment primary key
  7.   TYPE    smallint not null
  8.   USER_ID integer 
  9.   ... 
  10.  
  11. create index EVENTS_USER_IDX on EVENTS(USER_ID); 

好的,現(xiàn)在讓我們使用這些表:從一小部分用戶開始,我們想找到那些沒有特定事件的用戶。 使用NOT IN子句,并確保null值不出現(xiàn)在內部結果中,查詢如下所示:

  1. select  ID 
  2. from    USERS 
  3. where   ID in (1, 7, 2431, 87142, 32768) 
  4. and     ID not in 
  5.         ( 
  6.         select  USER_ID 
  7.         from    EVENTS 
  8.         where   TYPE = 7 
  9.         and     USER_ID is not null 
  10.         ); 

對于我的測試數據集,USERS表有100,000行,EVENTS表有10,000,000行,并且EVENTS表中大約75%的USER_ID為空。 我在我的筆記本電腦上運行這條查詢,它有一個Core i7處理器,12 GB的RAM和一個SSD。

我一直運行了約2分鐘,這真是...哇。

讓我們用NOT EXISTS和相關的子句替換NOT IN:

  1. select  ID 
  2. from    USERS 
  3. where   ID in (1, 7, 2431, 87142, 32768) 
  4. and     not exists 
  5.         ( 
  6.         select  1 
  7.         from    EVENTS 
  8.         where   USER_ID = USERS.ID 
  9.         and     TYPE = 7 
  10.         ); 

這個版本運行在0.01秒,這比我預期的時間更短。

是時候比較一下執(zhí)行計劃了。 ***個計劃來自NOT IN查詢,第二個來自NOT EXISTS。

  1. +----+--------------------+--------+------------+----------------+-----------------+-----------------+---------+------+------+----------+--------------------------+ 
  2. | id | select_type        | table  | partitions | type           | possible_keys   | key             | key_len | ref  | rows | filtered | Extra                    | 
  3. +----+--------------------+--------+------------+----------------+-----------------+-----------------+---------+------+------+----------+--------------------------+ 
  4. |  1 | PRIMARY            | USERS  | NULL       | range          | PRIMARY         | PRIMARY         | 4       | NULL |    5 |   100.00 | Using where; Using index | 
  5. |  2 | DEPENDENT SUBQUERY | EVENTS | NULL       | index_subquery | EVENTS_USER_IDX | EVENTS_USER_IDX | 5       | func |  195 |    10.00 | Using where              | 
  6. +----+--------------------+--------+------------+----------------+-----------------+-----------------+---------+------+------+----------+--------------------------+ 

執(zhí)行計劃幾乎相同:都是從USERS表中選擇行,然后使用嵌套循環(huán)連接(“DEPENDENT SUBQUERY”)從EVENTS表中檢索行。都聲稱使用EVENTS_USER_IDX在子查詢中選擇行。并且他們在每一步都估計了相似的行數。

但更仔細地查看連接類型。 NOT IN版本使用 index_subquery,而NOT EXISTS版本使用 ref。再查看ref列:NOT EXISTS版本使用了對其它列的顯式引用,而NOT IN使用了一個函數。這里發(fā)生了什么?

index_subquery連接類型表示MySQL將掃描索引以查找子查詢的相關行。可能是這個問題嗎?我不這么認為,因為EVENTS_USER_IDX索引是“narrow”類型:它只有一列,所以引擎不應該讀取大量的塊來查找對應的外部查詢的ID行(的確,我嘗試了各種查詢來測試這個索引,并且所有的運行都在幾百分之一秒內)。

為了獲取更多信息,我轉向使用“extended”執(zhí)行計劃。 要查看此計劃,請使用explain extended作為查詢前綴,并接著使用 show warnings得到被MySQL優(yōu)化器優(yōu)化后的查詢語句。 這是從NOT IN查詢得到的(為了清晰重新格式化了):

  1. /* select#1 */  select `example`.`USERS`.`ID` AS `ID`  
  2.                 from    `example`.`USERS`  
  3.                 where   ((`example`.`USERS`.`ID` in (1,7,2431,87142,32768))  
  4.                         and (not
  5.  
  6.     (`example`.`USERS`.`ID`, 
  7.  
  8.  
  9.      ( 
  10.  
  11.       ( 
  12.  
  13.        (`example`.`USERS`.`ID`) in EVENTS on EVENTS_USER_IDX checking NULL where ((`example`.`EVENTS`.`TYPE` = 7) and (`example`.`EVENTS`.`USER_ID` is not null)) having  
  14.  
  15.         (`example`.`EVENTS`.`USER_ID`)))))))  

我找不到“on EVENTS_USER_IDX checking NULL”的解釋,但我認為發(fā)生的是:優(yōu)化器認為它正在執(zhí)行一個IN查詢,可以在結果中包含NULL; 在做出此決定時,它不考慮where子句中的空檢查。 因此,它將檢查(examine)USER_ID為null的750萬行,以及與外部查詢的值匹配的幾十行。 通過“檢查(examine)”,我的意思是它將讀取表行,然后應用不為null條件。 此外,基于運行查詢所花費的時間,我認為它為外部查詢中的每個候選值執(zhí)行了此操作。

所以,本文的論點是:每當你想在可為空的列上使用IN或NOT IN子查詢時,請重新思考并使用EXISTS或NOT EXISTS代替。

責任編輯:武曉燕 來源: 可譯網
相關推薦

2022-11-02 07:39:53

CPU計算機C 語言

2012-02-03 14:39:12

Java

2015-08-12 10:04:24

2021-09-06 15:29:16

大數據防疫信息安全

2010-04-28 14:38:26

云計算

2010-10-18 10:51:00

蘋果

2023-06-02 13:53:56

2025-06-04 03:25:00

Java浮點數數學缺陷

2020-05-12 11:25:50

MySQLES數據庫

2010-07-19 11:12:43

Perl 不等于

2011-08-08 09:59:35

Android

2023-03-07 07:45:28

2015-12-01 10:42:07

2019-08-27 08:43:15

2013-11-26 09:55:12

2019-10-21 11:20:12

編程小程序開發(fā)

2023-11-08 13:32:00

JavaScript浮點數計算

2023-06-06 16:54:00

2017-05-15 09:55:07

2012-11-12 14:27:56

點贊
收藏

51CTO技術棧公眾號

国产亚洲色婷婷久久99精品| 日本一级大毛片a一| av在线中文| 九九视频精品免费| 久久久久久久久国产精品| 亚洲国产精品无码久久久久高潮| 日韩av中字| 一区二区三区四区五区视频在线观看| 国产伦精品一区二区三区视频免费| 国产在线观看黄色| 天天综合一区| 亚洲九九九在线观看| 我看黄色一级片| 国产美女情趣调教h一区二区| 久久久久久久久久久久久久久99| 成人在线免费观看视视频| 日本视频免费在线| 亚洲成人国产| 一区二区三区在线播放欧美| 午夜影院免费版| 韩日精品一区| 天天色综合天天| 欧美日韩一区二区三区电影| 男女网站在线观看| 成人a区在线观看| 青草视频在线观看视频| 中文字幕第36页| 亚洲淫性视频| 国产欧美日韩综合精品一区二区| 97碰碰视频| 一级黄色大毛片| 久久精品成人| 国模精品视频一区二区三区| 精品国产大片大片大片| 少妇精品久久久一区二区| 精品欧美一区二区三区精品久久 | 国产精品91久久| 久久国产在线视频| 国产精品福利在线观看播放| 国产亚洲视频中文字幕视频| 国产熟女高潮一区二区三区| 欧美激情精品| 欧美一区二区美女| 波多野结衣国产精品| 国产精品久久亚洲不卡| 色综合久久99| 亚洲黄色a v| 免费看av不卡| 日本精品一区二区三区高清| 91av资源网| 激情视频网站在线播放色| 夜夜揉揉日日人人青青一国产精品| 一区二区三区国| 色网站在线看| 亚洲桃色在线一区| 国产日产欧美一区二区| 成人三级网址| 亚洲欧美激情视频在线观看一区二区三区| 亚洲欧美99| 嫩草在线视频| 亚洲欧美色图小说| 青草网在线观看| 激情黄产视频在线免费观看| 欧美日韩免费在线| 日韩中文字幕组| 国产一区二区三区朝在线观看| 在线区一区二视频| 天堂网在线免费观看| 成人短视频软件网站大全app| 欧美精品久久久久久久多人混战| 久久婷婷中文字幕| 试看120秒一区二区三区| 精品国产乱码久久| 91精品人妻一区二区| 久久不见久久见免费视频7| 国产一区二区三区视频| 三级黄色免费观看| 欧美三级小说| 欧美亚洲一区在线| 中文字幕你懂的| 国产福利91精品| 久久久神马电影| 91最新在线| 亚洲综合丁香婷婷六月香| 亚洲熟妇无码另类久久久| 欧美动物xxx| 7777精品伊人久久久大香线蕉完整版 | 日韩成人午夜影院| 精品丝袜在线| 欧美体内she精视频| a级大片免费看| 久草成人在线| 蜜臀久久99精品久久久无需会员 | 黄色国产精品一区二区三区| 国产免费av高清在线| 亚洲人精品午夜| 国产97在线 | 亚洲| 精品久久在线| 亚洲精品二三区| 久艹在线观看视频| 国产亚洲午夜| 亚洲伊人成综合成人网| 欧美女v视频| 亚洲自拍与偷拍| 久久久久久久久久久久91| 最新精品在线| 日韩一级裸体免费视频| 久久久久久久久久久久久久av| 美女视频一区二区| 精品一区二区三区视频日产| 麻豆视频在线| 亚洲一区二区三区中文字幕在线| 亚洲五月天综合| 成人激情自拍| 久久综合电影一区| japanese国产在线观看| 成人爱爱电影网址| 日韩成人午夜影院| 亚洲资源在线| 中文字幕免费精品一区高清| 日本在线观看视频网站| 国产精品自拍一区| 亚洲午夜在线观看| 日韩三级影视| 日韩精品高清视频| 日韩人妻无码一区二区三区99| 激情深爱一区二区| 亚洲狠狠婷婷综合久久久| 人在线成免费视频| 精品久久久久久久久久久院品网 | 午夜久久福利影院| 国产一级片中文字幕| 日本一本不卡| 国产精品久久精品| 懂色一区二区三区| 欧美在线免费视屏| 午夜在线观看一区| 亚洲在线视频| 久久久久久欧美精品色一二三四| 国产污视频在线播放| 精品欧美乱码久久久久久1区2区| 欧美丰满熟妇bbbbbb| 久久国产欧美日韩精品| 亚洲欧洲日本国产| 欧洲亚洲精品久久久久| www.久久久久| 国产精品嫩草影院精东| 中文字幕视频一区| www.色.com| 欧美三区不卡| 精品国产_亚洲人成在线| av免费不卡国产观看| 亚洲二区在线播放视频| 日本一区二区免费在线观看| 99精品偷自拍| 国产1区2区在线| 欧美精品久久久久久| 日韩av免费看| 一本一道波多野毛片中文在线| 欧美日韩中文另类| 男人av资源站| 国产不卡高清在线观看视频| 欧美极品少妇无套实战| 国产一区二区三区亚洲| 2020国产精品视频| 国产视频精选在线| 884aa四虎影成人精品一区| 四虎影视1304t| 国产一区二区三区在线看麻豆| 国产日韩第一页| 黄色免费大全亚洲| 国产成人一区二区三区电影| 岛国大片在线观看| 8v天堂国产在线一区二区| 久久久久久久久久99| 91蝌蚪porny九色| 三上悠亚av一区二区三区| 亚洲一区二区三区| 精品国产乱码久久久久软件| 日日夜夜天天综合| 超在线视频97| 人妻少妇精品无码专区久久| 91精品91久久久中77777| 顶级黑人搡bbw搡bbbb搡| 国产成人精品免费视频网站| 免费观看精品视频| 欧美电影一区| 国产一区二区在线网站 | 97碰碰视频| 欧美成人h版| 欧美大成色www永久网站婷| 五月激情丁香婷婷| 欧美日韩aaa| 日韩久久久久久久久| 国产精品卡一卡二卡三| 少妇精品无码一区二区三区| 日本欧美一区二区三区乱码| 成人在线国产视频| 日韩欧美字幕| 久精品国产欧美| 97色婷婷成人综合在线观看| 2019中文在线观看| 亚洲淫性视频| 综合国产在线视频| 三级在线电影| 日韩一卡二卡三卡| 成人黄色片在线观看| 亚洲五月六月丁香激情| 国产亚洲精品久久久久久豆腐| av毛片久久久久**hd| 亚洲综合伊人久久| 毛片av中文字幕一区二区| 日韩欧美国产免费| 欧美日韩伊人| 激情图片qvod| 91欧美在线| 日韩欧美精品久久| 婷婷亚洲成人| 国产伦精品一区二区三区免费视频| 亚洲色图图片| 国产精品久久久一区| 女海盗2成人h版中文字幕| 欧美高清视频免费观看| 免费黄网站在线播放| 国产亚洲xxx| 理论视频在线| 日韩电影免费在线观看中文字幕| 国产av无码专区亚洲a∨毛片| 在线观看日产精品| 亚洲天堂一区在线| 婷婷久久综合九色综合伊人色| 久久久久无码国产精品不卡| 中文字幕五月欧美| 三级黄色在线观看| 国产精品久久久久久久久久免费看| 极品人妻一区二区三区| 99久久免费精品| 亚洲av成人片无码| 不卡的看片网站| 中文在线观看免费视频| 成人免费观看男女羞羞视频| 在线免费观看av网| 国产另类ts人妖一区二区| 午夜一级免费视频| 国产一区二区91| 欧美污在线观看| 国产成人精品亚洲午夜麻豆| 日韩欧美中文视频| 风间由美一区二区三区在线观看| 欧美视频亚洲图片| 国产精品亚洲视频| 97精品人人妻人人| 99热这里都是精品| 37p粉嫩大胆色噜噜噜| 久久人人97超碰com| 免费观看av网站| 久久精品亚洲麻豆av一区二区 | 国产高清视频一区三区| 精品网站在线| 成人字幕网zmw| 日韩欧美中文字幕一区二区三区| 国产99在线免费| 欧美1区二区| 日本免费高清不卡| 99久久精品国产亚洲精品| 51xx午夜影福利| 在线亚洲一区| 992kp快乐看片永久免费网址| 蜜臀精品久久久久久蜜臀| 天天操精品视频| 成人国产在线观看| 无码人妻aⅴ一区二区三区69岛| 国产色婷婷亚洲99精品小说| av资源在线免费观看| 亚洲综合激情网| 免费av中文字幕| 欧美一级在线视频| 色综合888| 日韩网站免费观看| 51精品在线| 国产精品网站入口| 五月亚洲婷婷| 日韩久久久久久久| 欧美成人一品| 欧美精品第三页| 国产精品99久久久久久有的能看| 97香蕉碰碰人妻国产欧美| 国产人伦精品一区二区| 欧美爱爱小视频| 欧洲一区二区三区在线| 亚洲爱爱综合网| 在线精品高清中文字幕| 丁香花在线电影小说观看| 国产精品第2页| 大桥未久女教师av一区二区| 日韩精品无码一区二区三区| 欧美日韩专区| 国产美女18xxxx免费视频| 99在线精品免费| 男人晚上看的视频| 色素色在线综合| 人妻少妇精品无码专区| xxx一区二区| 97蜜桃久久| 91超碰在线电影| 日韩精品永久网址| 日本免费黄视频| 国产激情一区二区三区桃花岛亚洲| 国产小视频自拍| 午夜欧美在线一二页| 国产永久免费视频| 亚洲视频axxx| 亚洲三级欧美| 亚洲综合色av| 三级电影一区| 精品国产成人av在线免| av日韩在线网站| 久久免费视频播放| 日韩亚洲欧美高清| 麻豆视频在线免费观看| 国产精品久久久久久超碰| 色爱综合av| 久久精品国产sm调教网站演员| 亚洲一卡久久| av鲁丝一区鲁丝二区鲁丝三区| 亚洲免费观看在线观看| 亚洲最大成人在线视频| 亚洲人成在线免费观看| 亚洲天堂av影院| 久久精品欧美| 日韩一级大片| 亚州av综合色区无码一区| 亚洲最新在线观看| a天堂在线观看视频| 久久九九免费视频| 国产精品igao视频网网址不卡日韩| 神马欧美一区二区| 日本亚洲免费观看| 日韩不卡av在线| 色综合久久66| 国产免费视频在线| 国产精品久久久久久久久久尿| 最新国产精品视频| 粉嫩虎白女毛片人体| 久久久欧美精品sm网站| 国产亚洲欧美日韩高清| 国产亚洲精品一区二555| 欧美性理论片在线观看片免费| 日本不卡一二三区| 久久一区二区三区超碰国产精品| 麻豆精品免费视频| 欧美日韩亚洲综合一区| 亚洲精品承认| 3d精品h动漫啪啪一区二区| 最新欧美人z0oozo0| 在线播放第一页| 岛国av一区二区三区| 国内三级在线观看| 国产精品看片资源| 99国产精品一区二区| 天天爽夜夜爽视频| 香蕉成人伊视频在线观看| 青春草在线观看 | 探花国产精品一区二区| 最新的欧美黄色| 久久久久久久久成人| 在线视频一二三区| 成人久久18免费网站麻豆| 久久不卡免费视频| 在线播放精品一区二区三区 | 日韩激情久久| 麻豆精品在线观看| 久久中文字幕在线观看| 亚洲精品视频免费| 亚洲天堂网站| 亚洲国产精品久久久久婷蜜芽| 久久久久久久久久久久久久久99| 国产又粗又猛视频| 国产+人+亚洲| 国产一区二区精品福利地址| 日韩成人av免费| 欧美日韩国产页| 黄网站在线免费| 久久99精品久久久久子伦| 蜜桃视频一区二区三区| 国产一级片播放| 中日韩美女免费视频网站在线观看| 精品成人18| 免费无码av片在线观看| 亚洲人成网站在线| 三级黄视频在线观看| 成人av在线天堂| 亚洲主播在线| a级黄色片免费看| 亚洲网址你懂得| 精品三级av在线导航| 天堂网在线免费观看| 欧美日韩午夜视频在线观看| 欧洲不卡av| 日本精品二区|