çå°è¿ç¯æç« ï¼è§£å³äºæå¯¹InåExistsåºå«ççæï¼è®°å½ä¸ä¸
åæ:http://blog.51cto.com/andrewli/2120928
èæ¯ä»ç»
æè¿å¨åSQLè¯å¥æ¶ï¼å¯¹éæ©IN è¿æ¯Exists ç¹è±«ä¸å³ï¼äºæ¯æä¸¤ç§æ¹æ³çSQLé½ååºæ¥å¯¹æ¯ä¸ä¸æ§è¡æçï¼åç°INçæ¥è¯¢æçæ¯Existsé«äºå¾å¤ï¼äºæ¯æ³å½ç¶ç认为INçæçæ¯Exists好ï¼ä½æ¬çå¯»æ ¹ç©¶åºçååï¼ææ³ç¥éè¿ä¸ªç»è®ºæ¯å¦éç¨ææåºæ¯ï¼ä»¥å为ä»ä¹ä¼åºç°è¿ä¸ªç»æã
ç½ä¸æ¥äºä¸ä¸ç¸å ³èµæï¼å¤§ä½å¯ä»¥å½çº³ä¸ºï¼å¤é¨è¡¨å°ï¼å é¨è¡¨å¤§æ¶ï¼éç¨Existsï¼å¤é¨è¡¨å¤§ï¼å é¨è¡¨å°æ¶ï¼éç¨INã飿就尿äºï¼å 为æçSQLè¯å¥éé¢ï¼å¤è¡¨åªæ1W级å«çæ°æ®ï¼å 表æ30W级å«çæ°æ®ï¼æç½ä¸ç说æ³åºè¯¥æ¯Existsçæç伿¯INé«çï¼ä½æçç»æå好ç¸åï¼ï¼
âæ²¡æè°æ¥å°±æ²¡æåè¨æâï¼äºæ¯æå¼å§ç ç©¶IN åExistsçå®é æ§è¡è¿ç¨ï¼ä»å®è·µçè§åº¦åºåï¼å¨æ ¹æ¬ä¸å»å¯»æ¾åå ï¼äºæ¯æäºè¿ç¯åæå享ã
å®éªæ°æ®
æçå®éªæ°æ®å æ¬ä¸¤å¼ 表ï¼t_author表 å t_poetry表ã
对åºè¡¨çæ°æ®éï¼
t_author表ï¼13355æ¡è®°å½ï¼
t_poetry表ï¼289917æ¡è®°å½ã
对åºçè¡¨ç»æå¦ä¸ï¼
CREATE TABLE t_poetry (
id bigint(20) NOT NULL AUTO_INCREMENT,
poetry_id bigint(20) NOT NULL COMMENT âè¯è¯idâ,
poetry_name varchar(200) NOT NULL COMMENT âè¯è¯åç§°â,
author_id bigint(20) NOT NULL COMMENT âä½è idâ
PRIMARY KEY (id),
UNIQUE KEY pid_idx (poetry_id) USING BTREE,
KEY aid_idx (author_id) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=291270 DEFAULT CHARSET=utf8mb4
CREATE TABLE t_author (
id int(15) NOT NULL AUTO_INCREMENT,
author_id bigint(20) NOT NULL,
author_name varchar(32) NOT NULL,
dynasty varchar(16) NOT NULL,
poetry_num int(8) NOT NULL DEFAULT â0â
PRIMARY KEY (id),
UNIQUE KEY authorid_idx (author_id) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=13339 DEFAULT CHARSET=utf8mb4
æ§è¡è®¡ååæ
IN æ§è¡è¿ç¨
sql示ä¾ï¼select * from tabA where tabA.x in (select x from tabB where y>0 );
å ¶æ§è¡è®¡åï¼
ï¼1ï¼æ§è¡tabB表çåæ¥è¯¢ï¼å¾å°ç»æéBï¼å¯ä»¥ä½¿ç¨å°tabB表çç´¢å¼yï¼
ï¼2ï¼æ§è¡tabAè¡¨çæ¥è¯¢ï¼æ¥è¯¢æ¡ä»¶æ¯tabA.xå¨ç»æéBéé¢ï¼å¯ä»¥ä½¿ç¨å°tabA表çç´¢å¼xã
Existsæ§è¡è¿ç¨
sql示ä¾ï¼select from tabA where exists (select from tabB where y>0);
å ¶æ§è¡è®¡åï¼
ï¼1ï¼å å°tabA表ææè®°å½åå°ã
ï¼2ï¼éè¡é对tabA表çè®°å½ï¼å»å ³ètabB表ï¼å¤ætabB表çåæ¥è¯¢æ¯å¦æè¿åæ°æ®ï¼5.5ä¹åççæ¬ä½¿ç¨Block Nested Loop(Block åµå¥å¾ªç¯)ã
ï¼3ï¼å¦æåæ¥è¯¢æè¿åæ°æ®ï¼åå°tabAå½åè®°å½è¿åå°ç»æéã
tabAç¸å½äºåå ¨è¡¨æ°æ®éåï¼tabBå¯ä»¥ä½¿ç¨å°ç´¢å¼ã
å®éªè¿ç¨
å®éªé对ç¸åç»æéçINåExists çSQLè¯å¥è¿è¡åæã
å å«INçSQLè¯å¥ï¼
select from t_author ta where author_id in
(select author_id from t_poetry tp where tp.poetry_id>3650 );
å å«ExistsçSQLè¯å¥ï¼
select from t_author ta where exists
(select * from t_poetry tp where tp.poetry_id>3650 and tp.author_id=ta.author_id);
ç¬¬ä¸æ¬¡å®éª
æ°æ®æ åµ
t_author表ï¼13355æ¡è®°å½ï¼t_poetry表ï¼åæ¥è¯¢çéç»æé where poetry_id>293650 ï¼121æ¡è®°å½ï¼
æ§è¡ç»æ
使ç¨existsèæ¶0.94Sï¼ ä½¿ç¨inèæ¶0.03Sï¼IN æçé«äºExistsã
åå åæ
对t_poetry表çåæ¥è¯¢ç»æéå¾å°ï¼ä¸ä¸¤è å¨t_poetry表é½è½ä½¿ç¨ç´¢å¼ï¼å¯¹t_poetryåæ¥è¯¢çæ¶èåºæ¬ä¸è´ã两è åºå«å¨äºï¼ä½¿ç¨ in æ¶ï¼t_author表è½ä½¿ç¨ç´¢å¼:
MySQLæ¥è¯¢è¯å¥ä¸çIN åExists 对æ¯åæ
使ç¨existsæ¶ï¼t_authorè¡¨å ¨è¡¨æ«æ:
MySQLæ¥è¯¢è¯å¥ä¸çIN åExists 对æ¯åæ
å¨åæ¥è¯¢ç»æéè¾å°æ¶ï¼æ¥è¯¢èæ¶ä¸»è¦è¡¨ç°å¨å¯¹t_author表çéåä¸ã
ç¬¬äºæ¬¡å®éª
æ°æ®æ åµ
t_author表ï¼13355æ¡è®°å½ï¼t_poetry表ï¼åæ¥è¯¢çéç»æé where poetry_id>3650 ï¼287838æ¡è®°å½ï¼
æ§è¡æ¶é´
使ç¨existsèæ¶0.12Sï¼ ä½¿ç¨inèæ¶0.48Sï¼Exists INã
åå åæ
两è çç´¢å¼ä½¿ç¨æ åµè·ç¬¬ä¸æ¬¡å®éªæ¯ä¸è´çï¼å¯ä¸åºå«æ¯åæ¥è¯¢çéç»æéç大å°ä¸åï¼ä½å®éªç»æå·²ç»è·ç¬¬ä¸æ¬¡çä¸åäºãè¿ç§æ åµä¸åæ¥è¯¢ç»æéå¾å¤§ï¼æä»¬ççmysqlçæ¥è¯¢è®¡åï¼
使ç¨inæ¶ï¼ç±äºåæ¥è¯¢ç»æéå¾å¤§ï¼å¯¹t_authoråt_poetryè¡¨é½æ¥è¿äºå ¨è¡¨æ«æï¼æ¤æ¶å¯¹t_author表çéåèæ¶å·®å¼å¯¹æ´ä½æçå½±åå¯ä»¥å¿½ç¥ï¼æ§è¡è®¡åéå¤äºä¸è¡ï¼å¨æ¥è¿å ¨è¡¨æ«æçæ åµä¸ï¼mysqlä¼åå¨éæ©äºauto_keyæ¥éåt_author表ï¼
MySQLæ¥è¯¢è¯å¥ä¸çIN åExists 对æ¯åæ
使ç¨existsæ¶ï¼æ°æ®éçååæ²¡æå¸¦æ¥æ§è¡è®¡åçæ¹åï¼ä½ç±äºåæ¥è¯¢ç»æéå¾å¤§ï¼5.5以åçMySQLçæ¬å¨existså¹é æ¥è¯¢ç»ææ¶ä½¿ç¨çæ¯Block Nested-Loopï¼Blockåµå¥å¾ªç¯ï¼å¼å ¥join bufferï¼ç±»ä¼¼äºç¼ååè½ï¼å¼å§å¯¹æ¥è¯¢æçäº§çæ¾èå½±åï¼å°¤å ¶éå¯¹åæ¥è¯¢ç»æéå¾å¤§çæ åµä¸è½æ¾èæ¹åæ¥è¯¢å¹é æçï¼
MySQLæ¥è¯¢è¯å¥ä¸çIN åExists 对æ¯åæ
å®éªç»è®º
æ ¹æ®ä¸è¿°ä¸¤ä¸ªå®éªåå®éªç»æï¼æä»¬å¯ä»¥è¾æ¸ æ°ççè§£IN åExistsçæ§è¡è¿ç¨ï¼å¹¶å½çº³åºIN åExistsçéç¨åºæ¯ï¼
INæ¥è¯¢å¨å é¨è¡¨åå¤é¨è¡¨ä¸é½å¯ä»¥ä½¿ç¨å°ç´¢å¼ï¼
Existsæ¥è¯¢ä» å¨å é¨è¡¨ä¸å¯ä»¥ä½¿ç¨å°ç´¢å¼ï¼
å½åæ¥è¯¢ç»æéå¾å¤§ï¼èå¤é¨è¡¨è¾å°çæ¶åï¼ExistsçBlock Nested Loop(Block åµå¥å¾ªç¯)çä½ç¨å¼å§æ¾ç°ï¼å¹¶å¼¥è¡¥å¤é¨è¡¨æ æ³ç¨å°ç´¢å¼ç缺é·ï¼æ¥è¯¢æçä¼ä¼äºINã
å½åæ¥è¯¢ç»æéè¾å°ï¼èå¤é¨è¡¨å¾å¤§çæ¶åï¼ExistsçBlockåµå¥å¾ªç¯ä¼åææä¸ææ¾ï¼IN çå¤è¡¨ç´¢å¼ä¼å¿å 主è¦ä½ç¨ï¼æ¤æ¶INçæ¥è¯¢æçä¼ä¼äºExistsã
ç½ä¸ç说æ³ä¸åç¡®ãå ¶å®â表çè§æ¨¡â䏿¯çå é¨è¡¨åå¤é¨è¡¨ï¼èæ¯å¤é¨è¡¨ååæ¥è¯¢ç»æéã
æåä¸ç¹ï¼ä¹æ¯æéè¦çä¸ç¹ï¼ä¸é´æ²¡æç»å¯¹çççï¼ææ¡äºç©çæ¬è´¨ï¼é对ä¸åçåºæ¯è¿è¡å®è·µéªè¯ææ¯æå¯é ææçæ¹æ³ã
å®éªè¿ç¨ä¸åç°çé®é¢è¡¥å
ä» å¯¹ä¸åæ°æ®éæ åµä¸çä¸è¿°existsè¯å¥åææ¶åç°ï¼æ°æ®éè¶å¤§ï¼æ¶èçæ¶é´åèåå°ï¼è§å¾å¾å¥æªã
å ·ä½æ¥è¯¢æ¡ä»¶ä¸ºï¼
where tp.poetry_id>3650ï¼èæ¶0.13S
where tp.poetry_id>293650ï¼èæ¶0.46S
å¯è½åå ï¼æ¡ä»¶å¼å¤§ï¼æ¥è¯¢è¶é åï¼éè¦éåçè®°å½è¶å¤ï¼é ææç»æ¶èè¶å¤çæ¶é´ãè¿ä¸ªè§£éæå¾ è¿ä¸æ¥éªè¯ååè¡¥å ã