MySQL深入——24

Join語句到底可不可用

join語句用于兩個或多個表當中檢索數據。

INNER JOIN或者JOIN 當兩個表當中有匹配的值時,返回行

LEFT JOIN或者LEFT OUTER JOIN? 返回所有左邊的行,即使右表當中沒有相匹配的行

RIGHT JOIN或者RIGHT OUTER JOIN??返回所有右邊的行,即使左表當中沒有相匹配的行

FULL JOIN或FULL OUTER JOIN? 左表或右表有匹配的行時,返回行。

一般在日常生活當中,Join語句通常集中于下面這幾個問題:1.DBA(DataBase Administer數據庫管理員)不讓使用join,使用join有什么問題?2.若有兩個大小不同的表,選擇哪個表作為驅動?

join語句的執行流程

創建兩個表t1,t2,都有主鍵索引id和索引a,給t1插入100行數據,給t2插入1000條數據。

若是直接使用join語句,MySQL的優化器可能會選擇t1或t2作為驅動表,為了方便分析,便限定出驅動表是什么。

select * from t1 straight_join t2 on(t1.a=t2.a)

使用straight_join讓MySQL使用固定的方式執行查詢,t1作為驅動表,t2作為被驅動表。

通過查看explain語句,知道了執行流程為:

1.從表t1中讀取一行數據R?

2.從數據頁R當中取出字段到表t2中去查找滿足的行,當滿足的時候作為結果集的一部分返回

4.在t1中再讀取一行進行對比。

5.直到t1被取完。

這個流程當中,對t1進行全表掃描,對于每一個行R,根據a索引去t2查找,走的是樹查找過程,t1是全表遍歷,總計掃描200行。這個算法稱之為:Index Nested-Loop Join簡稱為NLJ算法。

那么假設不使用join,使用單表查詢來做,首先得select * from t1? 取出t1所有的值,共計100行。然后取出a的值進入t2進行遍歷查詢,返回結果構成一個結果集。我們可以看到不僅多了100多次交互,而且我們還得自己拼接結果集,所以使用join更好。

那么該如何選擇驅動表呢?

通過分析得知,join語句執行過程中,驅動表走全表查詢,被驅動表走樹查詢,可知驅動表越小越好。但是前提是我們可以使用被驅動表的索引下,若果被驅動表不使用索引會是什么情況。

將select語句改為select * from t1 straight_join t2 on(t1.a=t2.b)

b上無索引,所以每次匹配都要做一個全表掃描,這樣子看上去十分繁重,所以InnoDB使用了一個Block Nested-Loop Join算法簡稱BNL算法,實現如下

因為select * 所以我們將t1全表放入到線程內存Join_buffer當中,掃描t2,將t2的每一行與Join_buffe當中的值作比較,由于Join_Buffer是無序的,所以對于t2的每一行,都要走一遍全表判斷,故在內存做判斷數為10萬次。

因為是在內存當中操作,所以會更快。

而且這里是無所謂選什么表作為驅動表的,因為掃描的行數始終為一個表的行數乘上另外一個表的行數。

這里其實還存在著一個問題,要是表的數據過大,join_buffer無法放下一整個表該如何呢?
join_buffer的大小由join_buffer_size決定,默認為256k

處理方法其實很簡單,就是分段放,假設join_buffer只能容納下t1的一半,那么我們先放一半進去,然后掃描t2,將t2當中每一行取出來與t1在join_buffer當中的數據作比較,滿足Join條件的返回結果集,最后判斷結束后,清空join_buffer,將剩下的join_buffer放入繼續判斷。

這種情況下的驅動表選擇是有說法的,驅動表的行數為n,被驅動表為m,n改為x*n(x*n是能放入join_buffer的大小)

1.掃描:n+x*n*m

2.內存判斷:n*m次

我們可以看到x是越小越好的,join_buffer的大小固定,表越小x越小,所以選擇小表作為驅動表。

那么什么是小表,定義是什么呢?

可以讓兩個表都不用索引,按照自己的條件過濾,運行完成之后計算join的各個字段數據量,數據量少的即為小表作為驅動表。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713449.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713449.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713449.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

整數的分離與合成

整數是由數字和數位組成的,比如327是一個三位數,它的數字是3、2、7,數位是個數、十位、百位。 經常有些題目考查將一個整數拆分成各個數字,以及將各個數字合成一個整數,下面分別就此討論。 注:只考慮正整數&#xff…

C語言學生成績信息管理系統【結構體+文本】

功能描述&#xff1a; 1、錄入成績 2、顯示不及格學生信息 3、統計每檔學生數量 4、總成績統計 代碼&#xff1a; #include<stdio.h>#define N 30//結構體&#xff1a;typedef struct STUDENT{char id[10];//學號char name[20];//姓名float score[3];//三門成績,分別代…

Socket網絡編程(四)——點對點傳輸場景方案

目錄 場景如何去獲取到TCP的IP和Port&#xff1f;UDP的搜索IP地址、端口號方案UDP搜索取消實現相關的流程&#xff1a;代碼實現邏輯服務端實現客戶端實現UDP搜索代碼執行結果 TCP點對點傳輸實現代碼實現步驟點對點傳輸測試結果 源碼下載 場景 在一個局域網當中&#xff0c;不知…

生成式人工智能治理:入門的基本技巧

GenAI 以前所未有的速度調解并擾亂了“一切照舊”&#xff0c;同時帶來了令人難以置信的力量&#xff0c;但也帶來了不可否認的責任。當然&#xff0c;現代企業非常熟悉技術進步。然而&#xff0c;人工智能的到來&#xff08;和實施&#xff09;無疑引起了相當大的沖擊&#xf…

C# 12 中的新增功能

本文內容 主構造函數集合表達式ref readonly 參數默認 Lambda 參數 顯示另外 5 個 C# 12 包括以下新增功能。 可以使用最新的 Visual Studio 2022 版本或 .NET 8 SDK 嘗試這些功能。 主構造函數 - 在 Visual Studio 2022 版本 17.6 預覽版 2 中引入。 集合表達式 - 在 Visu…

ThreeJs同一個場景多個相機的顯示

在threeJs開發數字孿生中&#xff0c;我們正常是需要使用一個相機&#xff0c;畫面顯示的內容也就是這個相機拍攝到的內容&#xff0c;但是是否可以添加多個相機&#xff0c;可以同時從不同角度觀察模型呢&#xff0c;實際上是可以的&#xff0c;不過多個相機的拍攝到的畫面肯定…

Linux uname命令教程:了解系統信息和配置(附實例詳解和注意事項)

Linux uname命令介紹 uname&#xff08;Unix Name&#xff09;命令用于顯示系統信息&#xff0c;包括內核名稱、網絡節點名稱、操作系統名稱、版本號、硬件名稱和處理器類型。它是一個基本的系統管理工具&#xff0c;通常用于識別系統配置。 Linux uname命令適用的Linux版本 …

Linux服務:Nginx反向代理與負載均衡

一、Nginx反向代理 1、什么是反向代理&#xff1f; 代理分為兩類&#xff0c;正向代理和反向代理。 ①正向代理&#xff1a;幫助用戶訪問服務器&#xff0c;緩存服務器內容。 ②反向代理&#xff1a;代理服務器處理用戶的請求&#xff0c;決定轉發請求給誰處理負載均衡的作…

Go 與 Rust:導航編程語言景觀

在當今構建軟件時&#xff0c;開發者在編程語言上有著豐富的選擇。兩種脫穎而出的語言是 Go 和 Rust - 都很強大但卻截然不同。本文將從各種因素比較這兩種語言&#xff0c;以幫助您確定哪種更適合您的需求。 我們將權衡它們在并發、安全性、速度、互操作性等方面的方法。我們將…

Ubuntu篇——crontab修改編輯器

輸入命令: crontab -e 如果你的系統是第一次使用crontab服務&#xff0c;會首先讓你選擇一個編輯器 如果已經選擇過編輯器&#xff0c;后續想要修改默認編輯器&#xff0c;可以輸入sudo select-editor進行修改。

【GPU驅動開發】-GPU架構簡介

前言 不必害怕未知&#xff0c;無需恐懼犯錯&#xff0c;做一個Creator&#xff01; GPU&#xff08;Graphics Processing Unit&#xff0c;圖形處理單元&#xff09;是一種專門用于處理圖形和并行計算的處理器。GPU系統架構通常包括硬件和軟件層面的組件。 一、總體流程 應…

Node.js基礎---Express中間件

1. 概念 1.什么是中間件 中間件(Middleware)&#xff0c;特指業務流程的中間處理環節 2. Express 中間件的調用流程 當一個請求到達 Express 的服務器后&#xff0c;可以連續調用多個中間件&#xff0c;從而對這次請求進行預處理 3. Express 中間件格式 Express 的中間件&…

每周一算法:雙端隊列廣搜

題目鏈接 電路維修 題目描述 達達是來自異世界的魔女&#xff0c;她在漫無目的地四處漂流的時候&#xff0c;遇到了善良的少女翰翰&#xff0c;從而被收留在地球上。翰翰的家里有一輛飛行車。有一天飛行車的電路板突然出現了故障&#xff0c;導致無法啟動。 電路板的整體結…

Java實戰:SpringBoot集成ZXing實現二維碼生成與解析

一、引言 在信息化社會&#xff0c;二維碼已經深入到生活的各個角落&#xff0c;無論是支付、營銷、信息傳遞&#xff0c;甚至防偽溯源&#xff0c;二維碼都發揮了至關重要的作用。作為Java開發者&#xff0c;我們如何在SpringBoot項目中便捷地實現二維碼的生成與解析呢&#…

4、Redis-Set【常用】

目錄 一、Redis-Set特點 二、常用命令與交并差 三、Redis中Set類型應用場景 一、Redis-Set特點 1、無序&#xff1a;添加的是A,B,C&#xff1b;取出的可能是B,A,C 2、唯一&#xff1a;不允許元素重復 二、常用命令與交并差 常用命令 格式含義例子sadd key members[...]往k…

吳恩達機器學習筆記十四 多輸出的分類 多類和多標簽的區別 梯度下降優化 卷積層

這里老師想講的是multiclass classification和multilable classification的區別&#xff0c;下面是我從其他地方找到的說法: Multiclass classification 多類分類 意味著一個分類任務需要對多于兩個類的數據進行分類。比如&#xff0c;對一系列的橘子&#xff0c;蘋果或者梨的…

Stable Diffusion生成式擴散模型代碼實現原理

Stable Diffusion可以使用PyTorch或TensorFlow等深度學習框架來實現。這些框架提供了一系列的工具和函數&#xff0c;使得開發者可以更方便地構建、訓練和部署深度學習模型。因此可以使用PyTorch或TensorFlow來實現Stable Diffusion模型。 安裝PyTorch&#xff1a;確保您已經安…

Linux命令行與shell腳本編程大全-2.2

第二部分 shell腳本編程基礎 第11章構建基礎腳本 第12章結構化命令 第13章更多的結構化命令 第14章處理用戶輸入 第15章呈現數據 第16章腳本控制 第15章 呈現數據 15.1 理解輸入和輸出 15.1.1 標準文件描述符 Linux 系統會將每個對象當作文件來處理&#xff0c;這包括輸入和…

T3SF:一款功能全面的桌面端技術練習模擬框架

關于T3SF T3SF是一款功能全面的桌面端技術練習模擬框架&#xff0c;該工具針對基于主場景事件列表的各種事件提供了模塊化的架構&#xff0c;并包含了針對每一個練習定義的規則集&#xff0c;以及允許為對應平臺參數定義參數的配置文件。 該工具的主模塊能夠執行與其他特定模…

CDN原理探究

來源于百度&#xff1a; https://baike.baidu.com/item/%E5%86%85%E5%AE%B9%E5%88%86%E5%8F%91%E7%BD%91%E7%BB%9C/4034265?frge_ala 通過上圖&#xff0c;我們可以了解到&#xff0c;使用了CDN緩存后的網站的訪問過程變為&#xff1a; 用戶向瀏覽器提供要訪問的域名&#xff…