in和exists的取舍
之前說(shuō)過(guò)要小表驅(qū)動(dòng)大表,即先遍歷小表再遍歷大表,接下來(lái)看一下in和exists的區(qū)別
in
先執(zhí)行子查詢,適合于外表大而內(nèi)表小的情況
select?*?from?A?where?id?in?(select?id?from?B)
等價(jià)于==
先遍歷表B?select?id?from?B
再遍歷表A?select?*?from?A?where?A.id?=?B.id
in的參數(shù)是子查詢時(shí),會(huì)將子查詢結(jié)果存儲(chǔ)在一張臨時(shí)的表中(內(nèi)聯(lián)視圖),然后掃描整個(gè)視圖
exists
以外層表作為驅(qū)動(dòng)表,外層表先被訪問(wèn),適合于外表大而內(nèi)表小的情況
select?*?from?A?where?id?exists?(select?1?from?A.id?=?B.id)
等價(jià)于
先遍歷表A??select?*?from?A
再遍歷表B??select?*?from?B?where?A.id?=?B.id
將主查詢數(shù)據(jù)放到子查詢中做驗(yàn)證,根據(jù)驗(yàn)證結(jié)果來(lái)確定主查詢結(jié)果的去留
使用exists數(shù)據(jù)庫(kù)不會(huì)生成臨時(shí)的表
結(jié)論
根據(jù)執(zhí)行順序也就得知了什么時(shí)候該用in什么時(shí)候該用exists了
即 子查詢數(shù)據(jù)量大的時(shí)候用exists
https://zhhll.icu/2021/數(shù)據(jù)庫(kù)/關(guān)系型數(shù)據(jù)庫(kù)/MySQL/進(jìn)階/7.in和exists的取舍/文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-818626.html
本文由 mdnice 多平臺(tái)發(fā)布文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-818626.html
到了這里,關(guān)于MySQL in和exists的取舍的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!