色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

MySQL中的 inner join 和 left join的區別解析(小結果集驅動大結果集)

瀏覽:185日期:2023-05-08 10:17:46
目錄
  • 場景描述
  • inner join 和 left join 的區別

場景描述

以一個場景為例:

單據A:下游子表 (數據量級小)
單據B:下游主表(數據量級小)
單據C:中游子表(數據量級小)
單據D:中游主表(數據量級小)
單據E:上游子表(數據量級小)
單據F:上游主表(比其他表數據量級大)

需求:將單據F的某個字段,刷到單據A的某個字段上面。從A到F,都可以通過id連接索引的形式,來關聯。但是A到F的連接順序必須是從A到F順序連接。比如:

這幾個表的連接可以用下面的例子演示:

a join b on a.id = b.idb join c on b.id = c.mainIdc join d on c.id = d.tableIdd join e on d.id = e.tide join f on e.tid = f.code

inner join 和 left join 的區別

我們寫update語句的時候,肯定是想要用join連表的。但是到底是使用inner join;還是left join比較好呢?

  • left join:

select a.*,b.* from a left join b on a.id = b.id , 這兩個表連接,根據后面的on條件,如果b表里面的b.id不符合 a.id = b.id ,那么a表里面的所有數據列都會給展示出來。然后b表沒有這種數據,所以sql里面的 b.* 會被全部填充成null

  • inner join:

select a.*,b.* from a inner join b on a.id = b.id , 這兩個表連接,根據后面on條件,如果b表里面的b.id不符合 a.id = b.id ,那么a表里面的部分數據列(不符合a.id = b.id條件的)就不會展示。

根據上面的定義,left join常用于select 語句;這是為了防止a表會少一些匹配記錄,為了能展示全a表,所以使用left join。

如下圖所示:

索引角度理解小結果集驅動大結果集

不管是 left join 和 inner join,都要注意小結果集驅動大結果集。a表 join b表的時候,

還是看之前例子的SQL:

select a.*,b.* from a left join b on a.id = b.id

假設a表數量級是100萬條,b表數量級是100條。我這樣連接,就是大表驅動小表;直接看查找次數:

在用后面on條件連接兩個表的時候,首先要走B+樹索引進行匹配;拿a表這100w的數量級,逐條對比 -> B+樹 -> 匹配到 b表的記錄。假設B+樹查找b表的100條要用2次查找,那么最終查找次數就是: 100萬 * 2 次

如果是小表驅動大表:

select a.*,b.* from b left join a on a.id = b.id

那么就會拿b表這100條,逐條對比 -> B+樹 -> 匹配到 a表的記錄。假設B+樹查找a表的100w條要用3次查找,那么最終查找次數就是: 100 * 3 次

從索引匹配的角度講,小結果集驅動大結果集的效率優化了不是一點半點。我們要有意識地讓小表在左邊,大表在右邊

但是如果你用的是inner join,MySQL內部會做優化,自動讓小表在前大表在后。也就是說你怎么寫,效率都是一樣的。但是left join卻不能自動優化,這點需要注意!

update語句常用 inner join而不是left join

舉例如下SQL:

(任務目標:用f 表字段更新a表字段)

update a inner join b on a.id = b.idinner join c on b.id = c.mainIdinner join d on c.id = d.tableIdinner join e on d.id = e.tidinner join f on e.tid = f.codeset a.Demand_orgid = f.req_org_idwhere xxx = xxx;

update 原則上 都得用inner join。

看上面的SQL,假設你全部都用的left join做關聯,由于你最終update 的是 a的字段;假設a表在left join的過程中,因為某個點匹配不到f表,那么用f 表字段更新a表字段 這一個過程中,一旦有任意一個環節匹配不到,那么f 表的字段全都會用null填充。最終,a表匹配不到f表的數據,都會被更新成null !

但是如果你用inner join,用f 表字段更新a表字段 這一個過程中,一旦有任意一個環節匹配不到,那么a表匹配不到 f 表的所有數據就不會顯示,也就是說不會更新。

你想想,你都匹配不到數據列。你還更新啥,難道更新null嗎。基于上面的原因,inner join 其實就滿足需求了

況且!left join 要考慮這幾張表的大小關系,誰大誰小,小結果集驅動大結果集。但是inner join 就完全不用考慮此問題,因為inner join MySQL內部會做優化,自動讓小表在前大表在后。

到此這篇關于MySQL中的 inner join 和 left join的區別的文章就介紹到這了,更多相關mysql inner join 和 left join區別內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: MySQL
主站蜘蛛池模板: 中文字幕亚洲高清综合 | 亚洲精品国产成人99久久 | 亚洲欧美高清视频 | 免费人成黄页在线观看视频国产 | 国产精品免费aⅴ片在线观看 | 狠狠色丁香婷婷久久综合不卡 | 午夜一级成人 | 亚洲成a人片在线观看中文 亚洲成a人片在线观看中文!!! | 五月久久亚洲七七综合中文网 | 国内一级野外a一级毛片 | 性生活视频网 | 色综合久久88色综合天天 | 国产精品成人免费视频不卡 | 久久伊人成人网 | 国产系列在线播放 | 国产成人精品午夜免费 | 国产成人综合久久精品红 | 男人操美女 | 成人18免费入口 | 国产三级香港三韩国三级 | 国产成人精品久久一区二区三区 | 国产一二三区精品 | 男女朋友做爽爽爽免费视频网 | 最新欧美一级视频 | 一级毛片免费不卡在线视频 | 国产精品视频九九九 | 国产91啦 | 国产日韩欧美自拍 | 亚洲一级成人 | 欧美特级特黄a大片免费 | 欧美大片一区二区三区 | 国产91无套剧情在线播放 | 黄 色 免费网 站 成 人 | 日韩中文字幕在线观看视频 | 国产一区二区在线视频 | 蜜臀91精品国产高清在线观看 | 乱子伦农村xxxx | 亚洲在线播放视频 | 国产日韩欧美一区 | 亚洲国产精品视频 | 国产成人精品亚洲77美色 |