1. 程式人生 > >MySQL的JOIN(二):JOIN原理

MySQL的JOIN(二):JOIN原理

表連線演算法

Nested Loop Join(NLJ)演算法:
首先介紹一種基礎演算法:NLJ,巢狀迴圈演算法。迴圈外層是驅動表,循壞內層是被驅動表。驅動表會驅動被驅動表進行連線操作。首先驅動表找到第一條記錄,然後從頭掃描被驅動表,逐一查詢與驅動表第一條記錄匹配的記錄然後連線起來形成結果表中的一條記。被驅動表查詢完後,再從驅動表中取出第二個記錄,然後從頭掃描被驅動表,逐一查詢與驅動表第二條記錄匹配的記錄,連線起來形成結果表中的一條記錄。重複上述操作,直到驅動表的全部記錄都處理完畢為止。這就是巢狀迴圈連線演算法的基本思想,虛擬碼如下。

    foreach row1 from t1
        foreach row2 from t2
            
if row2 match row1 //row2與row1匹配,滿足連線條件 join row1 and row2 into result //連線row1和row2加入結果集

首先載入t1,然後從t1中取出第一條記錄,之後載入t2表,與t2表中的記錄逐個匹配,連線匹配的記錄。

Block Nested Loop Join(BNLJ)演算法:
再介紹一種高階演算法:BNLJ,塊巢狀迴圈演算法,可以看作對NLJ的優化。大致思想就是建立一個快取區,一次從驅動表中取多條記錄,然後掃描被驅動表,被驅動表的每一條記錄都嘗試與緩衝區中的多條記錄匹配,如果匹配則連線並加入結果集。緩衝區越大,驅動表一次取出的記錄就越多。這個演算法的優化思路就是減少內迴圈的次數從而提高表連線效率。

影響效能的因素

1.內迴圈的次數:現在考慮這麼一個場景,當t1有100條記錄,t2有10000條記錄。那麼,t1驅動t2與t2驅動t1,他們之間在效率上孰優孰劣?如果是單純的分析指令執行次數,他們都是100*10000,但是考慮到載入表的次數呢。首先分析t1驅動t2,t1表載入1次,t2表需要載入100次。然後分析t2驅動t1,t2表首先載入1次,但是t1表要載入10000次。所以,t1驅動t2的效率要優於t2驅動t1的效率。由此得出,小表驅動大表能夠減少內迴圈的次數從而提高連線效率。
另外,如果使用Block Nested Loop Join演算法的話,通過擴大一次快取區的大小也能減小內迴圈的次數。由此又可得,設定合理的緩衝區大小能夠提高連線效率

2.快速匹配:掃描被驅動表尋找合適的記錄可以看做一個查詢操作,如何提高查詢的效率呢?建索引啊!由此還可得出,在被驅動表建立索引能夠提高連線效率

3.排序:假設t1表驅動t2表進行連線操作,連線條件是t1.id=t2.id,而且要求查詢結果對id排序。現在有兩種選擇,方式一[...ORDER BY t1.id],方式二[...ORDER BY t2.id]。如果我們使用方式一的話,可以先對t1進行排序然後執行表連線演算法,如果我們使用方式二的話,只能在執行表連線演算法後,對結果集進行排序(Using temporary),效率自然低下。由此最後可得出,優先選擇驅動表的屬性進行排序能夠提高連線效率。

引用

相關推薦

MySQL的JOINJOIN原理

表連線演算法 Nested Loop Join(NLJ)演算法: 首先介紹一種基礎演算法:NLJ,巢狀迴圈演算法。迴圈外層是驅動表,循壞內層是被驅動表。驅動表會驅動被驅動表進行連線操作。首先驅動表找到第一條記錄,然後從頭掃描被驅動表,逐一查詢與驅動表第一條記錄匹配的記錄然後連線起來形成結果表中的一條記。被驅

SpringMVC乾貨系列從零搭建SpringMVC+mybatisspringMVC原理解析及常用註解

SpringMVC框架介紹 SpringMVC就是通過DispatcherServlet將一堆元件串聯起來的Web框架。 Spring MVC屬於SpringFrameWork的後續產品,已經融合在Spring Web Flow裡面。 Spring 框架提供了構建 We

dubbo原始碼分析超時原理以及應用場景

本篇主要記錄dubbo中關於超時的常見問題,實現原理,解決的問題以及如何在服務降級中體現作用等。 超時問題 為了檢查對dubbo超時的理解,嘗試回答如下幾個問題,如果回答不上來或者不確定那麼說明此處需要再多研究研究。 我只是針對個人的理解提問題,並不代表我理解的就是全面深入的,但我的問題如果也回答不

Kubernetes學習筆記網路原理

Kubernetes網路模型 Kubernetes網路模型設計的一個基礎原則是:每個Pod都擁有一個獨立的IP地址,而且假定所有Pod都在一個可以直接連通的、扁平的網路空間中。所以不管它們是否執行在同一個Node(宿主機)中,都要求它們可以直接通過對方的

瀏覽器工作原理瀏覽器渲染過程概述

sync 結構 dom end 繪制 fault 異步加載 步驟 targe 參考:https://segmentfault.com/a/1190000012925872#articleHeader4 瀏覽器器內核拿到內容後,渲染大概可以劃分成以下幾個步驟: 解析html

JAVA並行框架Fork/Join同步和異步

arp ont ack sso util private div ext string 在Fork/Join框架中,提交任務的時候,有同步和異步兩種方式。 invokeAll()的方法是同步的,也就是任務提交後,這個方法不會返回直到所有的任務都處理完了。 fork方法是異步

深入理解overlayfs使用與原理分析

在初步瞭解overlayfs用途之後,本文將介紹如何使用overlayfs以及理解該檔案系統所特有的一些功能特性。由於目前主線核心對overlayfs正在不斷的開發和完善中,因此不同的核心版本改動可能較大,本文儘量與最新的核心版本保持一致,但可能仍會存在細微的出入。 核心版本:Linux-4.1

面試專題HashMap底層執行原理

一、HashMap的資料結構 首先有一個數組,如果hashMap不進行擴容的話預設是16個長度的陣列,如果有hash衝突的話會使用單向連結串列來解決衝突。 1.1 HashMap的儲存結構 陣列、連結串列、紅黑樹(jdk1.8) HashMap中不單單隻有陣列結構,還有連結

Spring Cloud Eureka原理分析續租、下線、自我保護機制和自動清理服務端

續租、下線等操作比較直觀,實際上也不復雜。讓我們自己想想它們大概會在服務端有什麼操作。 renew: 更新Lease的lastUpdateTimestamp, 更新一下InstanceInfo的最新狀態。然後呼叫其他同伴節點的renew介面。 cancel:把lease從registry中移除,設

SurfaceFlinger原理Vsync事件的處理

  SurfaceFlinger內部有兩個EventThread,一個負責app端對Vsync訊號的監聽處理,一個負責SurfaceFlinger對Vsync訊號的監聽處理。SurfaceFlinger內部維持了一個MessageQueue,當SurfaceFlinger端的

現代通訊原理到底什麼是通訊系統?

  不知你有沒有想過什麼樣的系統稱之為通訊系統呢?我們常說現代意義上的通訊系統就是用光或者電訊號來傳輸資訊的系統。那麼我們家裡的用來傳輸電能的市電系統算不算通訊系統?我們用來照明的燈光是不是通訊系統呢?   我們來想想,通訊系統為什麼會產生。是因為對於接收端來說

zookeeper入門學習原理詳解

一 .Zookeeper功能簡介 ZooKeeper 是一個開源的分散式協調服務,由雅虎建立,是 Google Chubby 的開源實現。 分散式應用程式可以基於 ZooKeeper 實現諸如資料釋出/訂閱、負載均衡、命名服務、分散式協 調/通知

基礎演算法Kmeans聚類演算法的基本原理與應用

Kmeans聚類演算法的基本原理與應用       內容說明:主要介紹Kmeans聚類演算法的數學原理,並使用matlab程式設計實現Kmeans的簡單應用,不對之處還望指正。 一、Km

設計模式):單例模式 JVM類載入機制 JDK原始碼學習筆記——Enum列舉使用及原理 Java併發):雙重檢驗鎖定DCL Java併發(二):Java記憶體模型 Java併發(二):Java記憶體模型 Java併發):雙重檢驗鎖定DCL JDK原始碼學習筆記——Enum列舉使用及原理

單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許一個例項存在。 單例模式一般體現在類宣告中,單例的類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。 適用場合: 需要頻繁的進行建立和銷燬的物件; 建立物

微信自動回覆和自動搶紅包實現原理自動回覆

完成AccessibilityService的配置後,好像無從下手。先別急,先列印一些log看看吧。把下面的方法放在onAccessibilityEvent()裡: private void printEventLog(Accessibilit

Android熱修復以DexClassLoader類載入原理編寫demo實現類替換修復

上一篇文章簡易總結了熱修復實現的幾大原理,並詳細介紹了Android中的類載入機制及原始碼探索,Android的類載入機制涉及到ClassLoader、DexClassLoader 、PathClassLoader 、BaseDexClassLoader 、De

網絡學習筆記TCP可靠傳輸原理

不必要 不一定 網絡學習 建立 位置 arq協議 四種 數據碎片 cnblogs ??TCP數據段作為IP數據報的數據部分來傳輸的,IP層提供盡最大努力服務,卻不保證數據可靠傳輸。TCP想要提供可靠傳輸,需要采取一定的措施來讓不可靠的傳輸信道提供可靠傳輸服務。比如:出現差錯

Docker理解容器編排工具Kubernetes內部工作原理

一、Kubernetes是什麼   要說到Docker就不得不說說Kubernetes。當Docker容器在微服務的環境下數量一多,那麼統一的,自動化的管理自然少不了。而Kubernetes就是一個這樣的工具,它不僅僅提供了健康檢查和自修復,還有自動擴容縮容,以及服務發現和負載均衡等等功能。總的來說它使我們對

深入理解JS中的物件new 的工作原理

**目錄** - 序言 - 不同返回值的建構函式 - 深入 new 呼叫函式原理 - 總結 - 參考 **1.序言** 在 [深入理解JS中的物件(一):原型、原型鏈和建構函式](https://www.cnblogs.com/forcheng/p/12866827.html) 中,我們分析了JS中

理解SpringAOP 的概念與實現原理

[TOC] ## 什麼是 AOP AOP(Aspect Oriented Programming,面向切面程式設計)是一種程式設計正規化,它是對 OOP(Object Oriented Programming,面向物件程式設計)的一個補充。 OOP 允許我們通過類來定義物件的屬性和行為,由於物件的行