一、mysql連表查詢使用join和where的區別
JOIN的連接條件可以出現在(zai)ON關鍵字或(huo)者WHERE子句(ju)中,但(dan)是我們要特別注意 ON條件和WHERE條件生效(xiao)時機(ji)是不一(yi)樣的,在(zai)大(da)數據量情(qing)況下消(xiao)耗的資(zi)源可能會存在(zai)很大(da)的差異:
ON條件:做為過濾兩個連接表的笛卡爾積形成中間表的約束條件,生成的中間表已經是過濾后的數據WHERE條件:在有ON條件的兩表或多表連接中,是過濾中間表的約束條件,中間表先生成出來再做過濾此外,INNER JOIN中兩(liang)種條(tiao)件的(de)結果是(shi)相同(tong)的(de),但(dan)是(shi)用LEFT JOIN 時(RIGHT JOIN或FULL JOIN類似),因(yin)為無論ON的(de)條(tiao)件是(shi)否滿足都會(hui)返(fan)回(hui)左(zuo)表的(de)所有(you)記錄,因(yin)此下(xia)面兩(liang)個語句(ju)是(shi)不等(deng)價的(de):
SELECT * FROM tab1 LEFT JOIN tab2 ON (tab1.size = tab2.size) WHERE tab2.name=’AAA’;
SELECT * FROM tab1 LEFT JOIN tab2 ON (tab1.size = tab2.size AND tab2.name=’AAA’);
前面(mian)我(wo)們(men)提到(dao)只要是返回(hui)bool值表達式都可以做為JOIN的連(lian)接條(tiao)(tiao)件,因此有人會在ON條(tiao)(tiao)件上直接寫上形(xing)如 column1 != 100 的過濾條(tiao)(tiao)件,推薦用法(fa)是ON條(tiao)(tiao)件只進行連(lian)接操作,WHERE則用于過濾中間表的記錄。
延伸閱讀:
二、什么是Memory引擎
Memory引擎(qing)(qing)是Mysql的(de)(de)內存(cun)引擎(qing)(qing),在(zai)實現上,Memory存(cun)儲引擎(qing)(qing)不同于Innodb這種組織(zhi)索引結(jie)構(gou)(索引即是數(shu)據(ju)(ju),即數(shu)據(ju)(ju)存(cun)放(fang)(fang)在(zai)主(zhu)鍵索引上),而(er)是將索引和數(shu)據(ju)(ju)分開存(cun)儲。索引采用(yong)Hash的(de)(de)形式(shi),存(cun)放(fang)(fang)主(zhu)鍵id和指向數(shu)據(ju)(ju)的(de)(de)指針(zhen),而(er)數(shu)據(ju)(ju)則(ze)按(an)插(cha)入順(shun)序存(cun)放(fang)(fang)。我們稱這種數(shu)據(ju)(ju)組織(zhi)方(fang)式(shi)為(wei)堆組織(zhi)方(fang)式(shi)。