一、mysql連表查詢使用join和where的區別
JOIN的(de)連接條(tiao)件(jian)可(ke)以(yi)出(chu)現在(zai)(zai)ON關鍵字或者WHERE子(zi)句中,但是我們要特別注意 ON條(tiao)件(jian)和WHERE條(tiao)件(jian)生效時機是不一樣的(de),在(zai)(zai)大(da)數據量情況(kuang)下消耗的(de)資源可(ke)能會存在(zai)(zai)很大(da)的(de)差異:
ON條件:做為過濾兩個連接表的笛卡爾積形成中間表的約束條件,生成的中間表已經是過濾后的數據WHERE條件:在有ON條件的兩表或多表連接中,是過濾中間表的約束條件,中間表先生成出來再做過濾此外,INNER JOIN中(zhong)兩種(zhong)條件(jian)的(de)結果(guo)是相同的(de),但是用LEFT JOIN 時(RIGHT JOIN或FULL JOIN類似),因(yin)為無論ON的(de)條件(jian)是否滿足都會返回(hui)左(zuo)表的(de)所有記錄,因(yin)此下面(mian)兩個語(yu)句(ju)是不(bu)等(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’);
前面我們提到只要是(shi)返回(hui)bool值表達式(shi)都可(ke)以做為JOIN的(de)連接(jie)條(tiao)(tiao)件,因(yin)此有人會在(zai)ON條(tiao)(tiao)件上(shang)直接(jie)寫(xie)上(shang)形如 column1 != 100 的(de)過(guo)濾條(tiao)(tiao)件,推薦用(yong)法是(shi)ON條(tiao)(tiao)件只進行連接(jie)操作(zuo),WHERE則(ze)用(yong)于過(guo)濾中間(jian)表的(de)記錄。
延伸閱讀:
二、什么是Memory引擎
Memory引(yin)(yin)擎(qing)(qing)是Mysql的內(nei)存(cun)引(yin)(yin)擎(qing)(qing),在(zai)實現上(shang),Memory存(cun)儲引(yin)(yin)擎(qing)(qing)不同(tong)于Innodb這(zhe)種(zhong)組織(zhi)索引(yin)(yin)結構(索引(yin)(yin)即(ji)是數(shu)據(ju)(ju)(ju),即(ji)數(shu)據(ju)(ju)(ju)存(cun)放(fang)在(zai)主鍵(jian)索引(yin)(yin)上(shang)),而是將索引(yin)(yin)和(he)數(shu)據(ju)(ju)(ju)分開存(cun)儲。索引(yin)(yin)采(cai)用Hash的形式(shi),存(cun)放(fang)主鍵(jian)id和(he)指(zhi)向數(shu)據(ju)(ju)(ju)的指(zhi)針,而數(shu)據(ju)(ju)(ju)則按插入順序存(cun)放(fang)。我(wo)們稱這(zhe)種(zhong)數(shu)據(ju)(ju)(ju)組織(zhi)方式(shi)為堆(dui)組織(zhi)方式(shi)。