最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL語句優(yōu)化之JOIN和LEFT JOIN 和 RIGHT JOIN語句的優(yōu)化

 更新時間:2018年03月13日 11:00:21   投稿:wdc  
在數據庫的應用中,我們經常需要對數據庫進行多表查詢,然而當數據量非常大時多表查詢會對執(zhí)行效率產生非常大的影響,因此我們在使用JOIN和LEFT JOIN 和 RIGHT JOIN語句時要特別注意

在數據庫的應用中,我們經常需要對數據庫進行多表查詢,然而當數據量非常大時多表查詢會對執(zhí)行效率產生非常大的影響,因此我們在使用JOIN和LEFT JOIN 和 RIGHT JOIN語句時要特別注意;

SQL語句的join原理:

數據庫中的join操作,實際上是對一個表和另一個表的關聯,而很多錯誤理解為,先把這兩個表來一個迪卡爾積,然后扔到內存,用where和having條件來慢慢篩選,其實數據庫沒那么笨的,那樣會占用大量的內存,而且效率不高,比如,我們只需要的一個表的一些行和另一個表的一些行,如果全表都做迪卡爾積,這開銷也太大了,真正的做法是,根據在每一個表上的條件,遍歷一個表的同時,遍歷其他表,找到滿足最后的條件后,就發(fā)送到客戶端,直到最后的數據全部查完,叫做嵌套循環(huán)查詢。

1、LEFT JOIN 和 RIGHT JOIN優(yōu)化

在MySQL中,實現如 A LEFT JOIN B join_condition 如下:

1、表B依賴賴與表A及所有A依賴的表

2、表A依賴于所有的表,除了LEFT JOIN 的表(B)

3、join_condition決定了怎樣來讀取表B,where條件對B是沒有用的

4、標準的where會和LEFT JOIN聯合優(yōu)化

5、如果在A中的一行滿足where和having條件,B中沒有,會被填充null

RIGHT JOIN 與LEFT JOIN類似,這個位置是可以互換的

LEFT JOIN 與 正常JOIN之間的轉換原則上當where條件,對于生成的null行總返回false時,可以直接轉化為正常的join

如:

SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;

將被轉換為:

SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;

注:因為設置了條件t2.column2 =  5,那么對于所有的生成的t2為null的行都是不成立的

這樣的優(yōu)化將非??焖?,因為這樣相當于把外連接轉換為等值連接,少了很多行的掃描和判斷。

嵌套循環(huán)JOIN算法----Nested-Loop Join

簡單的嵌套循環(huán)算法就是從一個表開始,通過對表的條件找到一行,然后找下一個表的數據,找完后,又回到第一個表來尋找滿足條件的行

例如,有三個表t1, t2, t3,他們的join類型為:

Table  Join Type
t1   range
t2   ref
t3   ALL

最終生成的偽代碼為

for each row in t1 matching range { 
 for each row in t2 matching reference key { 
  for each row in t3 { 
   if row satisfies join conditions, 
     send to client 
  } 
 } 
} 

即,t1表通過范圍掃描,t2關聯t1,t3為全表掃描

注:先根據對t1表的條件范圍找到一行,和t2匹配,然后尋找t3的滿足條件的行

塊嵌套循環(huán)JOIN算法 ---- Block Nested-Loop Join

這個算法的應用為:由于之前的嵌套算法每讀一個表的一行后,就會讀下表,這樣內部的表會被讀很多次,所以,數據庫利用了join緩存(join buffer)來存儲中間的結果,然后讀取內部表的時候,找到一行,都和這個緩存中的數據比較,以此來提高效率。例如:一次從外表讀10行,然后讀內部表時,都和這10行數據進行比較。

MySQL使用join buffer的條件為:

1、join_buffer_size系統變量決定了每個join使用的buffer大小

2、join類型為index或all時,join buffer才能被使用

3、每一個join都會分配一個join buffer,即一個sql可能使用多個join buffer

4、join buffer 不會分配給第一個非常量表

5、只有需要引用的列會被放到join buffer中,不是整行

最終生成偽代碼為:

for each row in t1 matching range { 
 for each row in t2 matching reference key { 
  store used columns from t1, t2 in join buffer 
    這里將t1和t2使用的列存到join buffer中 
    if buffer is full { 
   for each row in t3 { 
    for each t1, t2 combination in join buffer { 
     if row satisfies join conditions, 
     send to client 
    } 
   } 
   empty buffer 
  } 
 } 
} 
 
if buffer is not empty { 
 for each row in t3 { 
  for each t1, t2 combination in join buffer { 
   if row satisfies join conditions, 
   send to client 
  } 
 } 
} 

注:在第二個循環(huán)才把數據存在join buffer中,這正好印證了上面的第4點

相關文章

  • 程序員應該知道的數據庫設計的兩個誤區(qū)

    程序員應該知道的數據庫設計的兩個誤區(qū)

    在幾乎所有的企業(yè)級應用程序中,包括各種MIS、ERP、CRM等等,都會使用數據庫,這樣的好處是顯而易見的,很容易地實現了數據層和業(yè)務邏輯層的分離,而且對于性能的優(yōu)化也在一定程度上提供了便利。
    2010-07-07
  • 深入解析NoSQL數據庫的分布式算法(圖文詳解)

    深入解析NoSQL數據庫的分布式算法(圖文詳解)

    這篇文章主要介紹了深入解析NoSQL數據庫的分布式算法,需要的朋友可以參考下
    2015-12-12
  • 詳解Navicat Premium基本使用

    詳解Navicat Premium基本使用

    Navicat是一套數據庫管理工具,專為簡化數據庫的管理及降低系統管理成本而設。這篇文章主要介紹了詳解Navicat Premium基本使用,需要的朋友可以參考下
    2020-11-11
  • SQLyog下載、安裝超詳細教程(親測永久有效)

    SQLyog下載、安裝超詳細教程(親測永久有效)

    SQLyog能夠幫助用戶輕松管理自己的MYSQL數據庫,SQLyog中文版支持多種數據格式導出,可以快速幫助用戶備份和恢復數據,還能夠快速地運行SQL腳本文件,為用戶的使用提供便捷
    2021-04-04
  • 詳解PyMySQL插入字典類型的數據

    詳解PyMySQL插入字典類型的數據

    在我們爬蟲或者調API獲取數據后,需要將數據存入到數據庫中,如果數據是列表嵌套字典格式的話,一般做法是遍歷列表,然后用字典生成對應的SQL語句再執(zhí)行插入到表中,本文將介紹一種更加簡便的方法來插入字典類型的數據,需要的朋友可以參考下
    2022-07-07
  • Navicat?for?MySQL導入csv文件時出現中文亂碼的問題解決

    Navicat?for?MySQL導入csv文件時出現中文亂碼的問題解決

    在做數據對接導入的時候使用的數據是CSV格式的文件,導入發(fā)現了亂碼,下面這篇文章主要給大家介紹了關于Navicat?for?MySQL導入csv文件時出現中文亂碼的問題解決辦法,需要的朋友可以參考下
    2023-12-12
  • MySQL mysqldump命令使用詳解

    MySQL mysqldump命令使用詳解

    MySQL有很多可以導入數據的方法,然而這些只是數據傳輸中的一半,另外的一般是從MySQL數據庫中導出數據。有許多的原因我們需要導出數據。一個重要的原因是用于備份數據庫。數據的造價常常是昂貴的,需要謹慎處理它們。
    2006-12-12
  • 淺談三種數據庫的?SQL?注入

    淺談三種數據庫的?SQL?注入

    本文主要介紹了淺談三種數據庫的SQL注入,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • SQL中日期格式處理方法大全

    SQL中日期格式處理方法大全

    這篇文章主要給大家介紹了關于SQL中日期格式處理方法的相關資料,在SQL中日期格式化非常重要的,因日期SQL中的一個基數據類型,我們可以使用函數和選項來格式化日期,使用日期函數來處理日期數據,需要的朋友可以參考下
    2023-09-09
  • 詳解通過SQL進行分布式死鎖的檢測與消除

    詳解通過SQL進行分布式死鎖的檢測與消除

    本文主要介紹在 GaussDB(DWS) 中,如何通過 SQL 語句,對分布式死鎖進行檢測和恢復。
    2021-05-05

最新評論

红安县| 伊宁县| 弥勒县| 和田县| 泽库县| 霍城县| 工布江达县| 新密市| 兰州市| 达州市| 凉山| 茂名市| 兰溪市| 渑池县| 大竹县| 安丘市| 湖口县| 辰溪县| 潮安县| 二连浩特市| 锡林浩特市| 孟津县| 柏乡县| 海南省| 北碚区| 怀集县| 肥乡县| 宜都市| 莱州市| 山西省| 垫江县| 沙河市| 彭泽县| 永昌县| 藁城市| 林州市| 鲁山县| 万山特区| 霍林郭勒市| 永顺县| 赫章县|