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

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

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

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

SQL語句的join原理:

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

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

在MySQL中,實(shí)現(xiàn)如 A LEFT JOIN B join_condition 如下:

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

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

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

4、標(biāo)準(zhǔn)的where會和LEFT JOIN聯(lián)合優(yōu)化

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

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

LEFT JOIN 與 正常JOIN之間的轉(zhuǎn)換原則上當(dāng)where條件,對于生成的null行總返回false時(shí),可以直接轉(zhuǎn)化為正常的join

如:

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

將被轉(zhuǎn)換為:

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

注:因?yàn)樵O(shè)置了條件t2.column2 =  5,那么對于所有的生成的t2為null的行都是不成立的

這樣的優(yōu)化將非??焖伲?yàn)檫@樣相當(dāng)于把外連接轉(zhuǎn)換為等值連接,少了很多行的掃描和判斷。

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

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

例如,有三個(gè)表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關(guān)聯(lián)t1,t3為全表掃描

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

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

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

MySQL使用join buffer的條件為:

1、join_buffer_size系統(tǒng)變量決定了每個(gè)join使用的buffer大小

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

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

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

5、只有需要引用的列會被放到j(luò)oin 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使用的列存到j(luò)oin 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 
  } 
 } 
} 

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

相關(guān)文章

  • 程序員應(yīng)該知道的數(shù)據(jù)庫設(shè)計(jì)的兩個(gè)誤區(qū)

    程序員應(yīng)該知道的數(shù)據(jù)庫設(shè)計(jì)的兩個(gè)誤區(qū)

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

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

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

    詳解Navicat Premium基本使用

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

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

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

    詳解PyMySQL插入字典類型的數(shù)據(jù)

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

    Navicat?for?MySQL導(dǎo)入csv文件時(shí)出現(xiàn)中文亂碼的問題解決

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

    MySQL mysqldump命令使用詳解

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

    淺談三種數(shù)據(jù)庫的?SQL?注入

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

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

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

    詳解通過SQL進(jìn)行分布式死鎖的檢測與消除

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

最新評論

开化县| 新巴尔虎左旗| 大渡口区| 苍山县| 隆林| 海口市| 邳州市| 西乡县| 彭水| 海城市| 菏泽市| 宁安市| 黑河市| 新竹县| 望谟县| 衡山县| 安溪县| 镇江市| 称多县| 东方市| 平湖市| 茌平县| 崇信县| 桃江县| 海门市| 沙湾县| 界首市| 卢龙县| 上林县| 玉田县| 南岸区| 嵊泗县| 河源市| 马公市| 贵溪市| 甘德县| 怀安县| 海南省| 洛扎县| 崇信县| 区。|