在MySQL 8.0.18版本里,支持對(duì)NOT IN/EXISTS子查詢語(yǔ)句優(yōu)化,優(yōu)化器內(nèi)部將查詢自動(dòng)重寫為AntiJoin反連接查詢SQL語(yǔ)句。
成都創(chuàng)新互聯(lián)公司于2013年開(kāi)始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元永修做網(wǎng)站,已為上家服務(wù),為永修各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220
通常情況下,我們希望由內(nèi)到外,先完成內(nèi)表里的查詢結(jié)果,然后驅(qū)動(dòng)外查詢的表,完成最終查詢,但是子查詢會(huì)先掃描外表中的所有數(shù)據(jù),每條數(shù)據(jù)將會(huì)傳到內(nèi)表中與之關(guān)聯(lián),如果外表很大的話,那么性能上將會(huì)很差。
讓我們看一個(gè)例子
explain?select?*?from?t1?where?id?not?in?(select?id?from?t2);
優(yōu)化器在內(nèi)部,是將not in子查詢重寫為下面的語(yǔ)句
explain?select?t1.*?from?t1?left?join?t2?on?t1.id=t2.id?where?t2.id?is?null;
對(duì)比兩個(gè)執(zhí)行計(jì)劃,結(jié)果是一樣的。