left join是相當(dāng)耗資源的操作,如果關(guān)聯(lián)的字段沒(méi)有索引的話,速度是很慢的,所以如果有l(wèi)eft join的話,最好用索引字段取關(guān)聯(lián)。
索引關(guān)聯(lián)理解
- inner join
- left join
如果是inner join的話,一邊有索引就可以了
如果是left join涂邀,主表可以不用索引谋旦,但另外張表就要索引
切記:小表驅(qū)動(dòng)大表遂蛀,給被驅(qū)動(dòng)表建立索引
EXPLAIN語(yǔ)句分析出來(lái)的第一行的表即是驅(qū)動(dòng)表
在以小表驅(qū)動(dòng)大表的情況下,再給大表建立索引會(huì)大大提高執(zhí)行速度
在join連接時(shí)哪個(gè)表是驅(qū)動(dòng)表诞挨,哪個(gè)表是被驅(qū)動(dòng)表:
- 當(dāng)使用left join時(shí)新荤,左表是驅(qū)動(dòng)表揽趾,右表是被驅(qū)動(dòng)表
- 當(dāng)使用right join時(shí),右表是驅(qū)動(dòng)表苛骨,左表是被驅(qū)動(dòng)表
- 當(dāng)使用join時(shí)篱瞎,mysql會(huì)選擇數(shù)據(jù)量比較小的表作為驅(qū)動(dòng)表,大表作為被驅(qū)動(dòng)表
left join 原理是 [左連接] 情況下左表全有痒芝,因此在右邊創(chuàng)建索引俐筋,得到比較理想的效果
然后 inner join 是因?yàn)閙ysql自帶得優(yōu)化器能自動(dòng)識(shí)別怎么去”找“更省時(shí)間
結(jié)論:left join:右邊創(chuàng)建索引;right join:左表創(chuàng)建索引
索引失效
場(chǎng)景:當(dāng)使用關(guān)聯(lián)查詢(inner 严衬、left澄者、right join)等進(jìn)行查詢時(shí)候,關(guān)聯(lián)條件都已建立索引请琳,但查看執(zhí)行計(jì)劃發(fā)現(xiàn)并未走索引粱挡。
原因:兩表字段的字符集不相同導(dǎo)致關(guān)聯(lián)查詢索引失效
解決方案:
- 修改表字段字符集類型,保證字符集一致
- 使用convert()函數(shù)俄精,保證關(guān)聯(lián)的索引字段 轉(zhuǎn)換后兩邊字符集一致
索引在關(guān)聯(lián)查詢中的作用
MySQL執(zhí)行[關(guān)聯(lián)查詢]的策略簡(jiǎn)單地說(shuō)询筏,先從一個(gè)表循環(huán)取出單條數(shù)據(jù),然后再循環(huán)到下一個(gè)表中尋找匹配的行竖慧,然后再下一個(gè)表嫌套,依次下去,直到找到所有表中匹配的行為止圾旨。然后根據(jù)各個(gè)表匹配的行踱讨,返回查詢中需要的各個(gè)列。
根據(jù)上述內(nèi)容砍的,第一張表很重要痹筛。但關(guān)聯(lián)順序并不是按照SQL語(yǔ)句中的順序。在執(zhí)行關(guān)聯(lián)查詢的時(shí)候,關(guān)聯(lián)查詢優(yōu)化器通過(guò)評(píng)估不同順序時(shí)的成本帚稠,選擇一個(gè)代價(jià)最小的關(guān)聯(lián)順序产雹。當(dāng)然如果需要,可以使用STRAIGHT_JOIN關(guān)鍵字人工指定關(guān)聯(lián)順序翁锡。
所以,多表關(guān)聯(lián)查詢夕土,比如三表關(guān)聯(lián)馆衔,執(zhí)行過(guò)程大概是,關(guān)聯(lián)查詢優(yōu)化器選擇其中一個(gè)查詢成本最小的表怨绣,一般是掃描行數(shù)最少角溃,然后根據(jù)關(guān)聯(lián)字段關(guān)聯(lián)后面第二、第三張表篮撑〖跸福可見(jiàn)如果第二、第三張表上有索引赢笨,就能大幅提高性能未蝌。優(yōu)化關(guān)聯(lián)查詢,確保ON或者USING子句上的列有索引茧妒。在創(chuàng)建索引的時(shí)候就要考慮到關(guān)聯(lián)順序萧吠。優(yōu)化器的關(guān)聯(lián)順序中最前面的表不需要在關(guān)聯(lián)列上建索引,只需在關(guān)聯(lián)順序中的第二個(gè)及以后表的相應(yīng)列上建索引桐筏。
可見(jiàn)纸型,在關(guān)聯(lián)查詢中,第一張表以后的多張表的關(guān)聯(lián)字段上的索引梅忌,可以同時(shí)起作用狰腌。
此外注意,要確保任何group by和order by中的表達(dá)式只涉及到一個(gè)表中的列牧氮,這樣mysql才有可能使用索引來(lái)優(yōu)化這個(gè)過(guò)程琼腔。