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

詳解Mysql多表聯(lián)合查詢效率分析及優(yōu)化

 更新時間:2021年09月27日 17:00:18   投稿:lijiao  
這篇文章主要介紹了Mysql多表聯(lián)合查詢效率分析及優(yōu)化,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文為大家講解了Mysql多表聯(lián)合查詢效率分析及優(yōu)化,供大家參考,具體內(nèi)容如下

1. 多表連接類型

1. 笛卡爾積(交叉連接) 在MySQL中可以為CROSS JOIN或者省略CROSS即JOIN,或者使用','  如:

SELECT * FROM table1 CROSS JOIN table2  
SELECT * FROM table1 JOIN table2  
SELECT * FROM table1,table2 

由于其返回的結(jié)果為被連接的兩個數(shù)據(jù)表的乘積,因此當有WHERE, ON或USING條件的時候一般不建議使用,因為當數(shù)據(jù)表項目太多的時候,會非常慢。一般使用LEFT [OUTER] JOIN或者RIGHT [OUTER] JOIN

 2.內(nèi)連接INNER JOIN 在MySQL中把INNER JOIN叫做等值連接,即需要指定等值連接條件在MySQL中CROSS和INNER JOIN被劃分在一起。 join_table: table_reference [INNER | CROSS] JOIN table_factor [join_condition]

3. MySQL中的外連接,分為左外連接和右連接,即除了返回符合連接條件的結(jié)果之外,還要返回左表(左連接)或者右表(右連接)中不符合連接條件的結(jié)果,相對應(yīng)的使用NULL對應(yīng)。

例子:

user表:

id | name
———
1 | libk
2 | zyfon
3 | daodao

user_action表:

user_id | action
—————
1 | jump
1 | kick
1 | jump
2 | run
4 | swim

sql:

select id, name, action from user as u 
left join user_action a on u.id = a.user_id 

result:
id | name    | action
——————————–
1  | libk         | jump           ①
1  | libk         | kick             ②
1  | libk         | jump           ③
2  | zyfon      | run               ④
3  | daodao | null              ⑤

分析:
注意到user_action中還有一個user_id=4, action=swim的紀錄,但是沒有在結(jié)果中出現(xiàn),
而user表中的id=3, name=daodao的用戶在user_action中沒有相應(yīng)的紀錄,但是卻出現(xiàn)在了結(jié)果集中
因為現(xiàn)在是left join,所有的工作以left為準.
結(jié)果1,2,3,4都是既在左表又在右表的紀錄,5是只在左表,不在右表的紀錄

工作原理:

從左表讀出一條,選出所有與on匹配的右表紀錄(n條)進行連接,形成n條紀錄(包括重復(fù)的行,如:結(jié)果1和結(jié)果3),如果右邊沒有與on條件匹配的表,那連接的字段都是null.然后繼續(xù)讀下一條。

引申:
我們可以用右表沒有on匹配則顯示null的規(guī)律, 來找出所有在左表,不在右表的紀錄, 注意用來判斷的那列必須聲明為not null的。
如:
sql:

select id, name, action from user as u 
left join user_action a on u.id = a.user_id 
where a.user_id is NULL 

注意:

        1.列值為null應(yīng)該用is null 而不能用=NULL
        2.這里a.user_id 列必須聲明為 NOT NULL 的.

上面sql的result:
id | name | action
————————–
3 | daodao | NULL

——————————————————————————–

一般用法:

a. LEFT [OUTER] JOIN:

除了返回符合連接條件的結(jié)果之外,還需要顯示左表中不符合連接條件的數(shù)據(jù)列,相對應(yīng)使用NULL對應(yīng)

復(fù)制代碼 代碼如下:
SELECT column_name FROM table1 LEFT [OUTER] JOIN table2 ON table1.column=table2.column 
b. RIGHT [OUTER] JOIN:

RIGHT與LEFT JOIN相似不同的僅僅是除了顯示符合連接條件的結(jié)果之外,還需要顯示右表中不符合連接條件的數(shù)據(jù)列,相應(yīng)使用NULL對應(yīng)

復(fù)制代碼 代碼如下:
SELECT column_name FROM table1 RIGHT [OUTER] JOIN table2 ON table1.column=table2.column 

Tips:

1. on a.c1 = b.c1 等同于 using(c1)
2. INNER JOIN 和 , (逗號) 在語義上是等同的
3. 當 MySQL 在從一個表中檢索信息時,你可以提示它選擇了哪一個索引。
如果 EXPLAIN 顯示 MySQL 使用了可能的索引列表中錯誤的索引,這個特性將是很有用的。
通過指定 USE INDEX (key_list),你可以告訴 MySQL 使用可能的索引中最合適的一個索引在表中查找記錄行。
可選的二選一句法 IGNORE INDEX (key_list) 可被用于告訴 MySQL 不使用特定的索引。如:

mysql> SELECT * FROM table1 USE INDEX (key1,key2) 
-> WHERE key1=1 AND key2=2 AND key3=3; 
mysql> SELECT * FROM table1 IGNORE INDEX (key3) 
-> WHERE key1=1 AND key2=2 AND key3=3; 

2. 表連接的約束條件

添加顯示條件WHERE, ON, USING

1. WHERE子句

mysql>

SELECT * FROM table1,table2 WHERE table1.id=table2.id;  

2. ON

mysql>

SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id;  

SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id  
LEFT JOIN table3 ON table2.id=table3.id; 

3. USING子句,如果連接的兩個表連接條件的兩個列具有相同的名字的話可以使用USING

例如:

SELECT FROM LEFT JOIN USING ()

連接多于兩個表的情況舉例:

mysql>

SELECT artists.Artist, cds.title, genres.genre  
 
FROM cds  
 
LEFT JOIN genres N cds.genreID = genres.genreID  
 
LEFT JOIN artists ON cds.artistID = artists.artistID; 

或者 mysql>

SELECT artists.Artist, cds.title, genres.genre  
FROM cds  
 
LEFT JOIN genres ON cds.genreID = genres.genreID  
 LEFT JOIN artists -> ON cds.artistID = artists.artistID 
 
 WHERE (genres.genre = 'Pop'); 

  --------------------------------------------

另外需要注意的地方 在MySQL中涉及到多表查詢的時候,需要根據(jù)查詢的情況,想好使用哪種連接方式效率更高。

 1. 交叉連接(笛卡爾積)或者內(nèi)連接 [INNER | CROSS] JOIN

 2. 左外連接LEFT [OUTER] JOIN或者右外連接RIGHT [OUTER] JOIN 注意指定連接條件WHERE, ON,USING.

3. MySQL如何優(yōu)化LEFT JOIN和RIGHT JOIN

在MySQL中,A LEFT JOIN B join_condition執(zhí)行過程如下:

1).根據(jù)表A和A依賴的所有表設(shè)置表B。

2).根據(jù)LEFT JOIN條件中使用的所有表(除了B)設(shè)置表A。

3).LEFT JOIN條件用于確定如何從表B搜索行。(換句話說,不使用WHERE子句中的任何條件)。

4).可以對所有標準聯(lián)接進行優(yōu)化,只是只有從它所依賴的所有表讀取的表例外。如果出現(xiàn)循環(huán)依賴關(guān)系,MySQL提示出現(xiàn)一個錯誤。

5).進行所有標準WHERE優(yōu)化。

6).如果A中有一行匹配WHERE子句,但B中沒有一行匹配ON條件,則生成另一個B行,其中所有列設(shè)置為NULL。

7).如果使用LEFT JOIN找出在某些表中不存在的行,并且進行了下面的測試:WHERE部分的col_name IS NULL,其中col_name是一個聲明為 NOT NULL的列,MySQL找到匹配LEFT JOIN條件的一個行后停止(為具體的關(guān)鍵字組合)搜索其它行。

RIGHT JOIN的執(zhí)行類似LEFT JOIN,只是表的角色反過來。

聯(lián)接優(yōu)化器計算表應(yīng)聯(lián)接的順序。LEFT JOIN和STRAIGHT_JOIN強制的表讀順序可以幫助聯(lián)接優(yōu)化器更快地工作,因為檢查的表交換更少。請注意這說明如果執(zhí)行下面類型的查詢,MySQL進行全掃描b,因為LEFT JOIN強制它在d之前讀取:

 SELECT * 
 FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key) 
 WHERE b.key=d.key; 

在這種情況下修復(fù)時用a的相反順序,b列于FROM子句中:

SELECT * 
FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key) 
WHERE b.key=d.key; 

MySQL可以進行下面的LEFT JOIN優(yōu)化:如果對于產(chǎn)生的NULL行,WHERE條件總為假,LEFT JOIN變?yōu)槠胀?lián)接。

例如,在下面的查詢中如果t2.column1為NULL,WHERE 子句將為false:

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

因此,可以安全地將查詢轉(zhuǎn)換為普通聯(lián)接:

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

這樣可以更快,因為如果可以使查詢更佳,MySQL可以在表t1之前使用表t2。為了強制使用表順序,使用STRAIGHT_JOIN。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助。

相關(guān)文章

  • mysql自增id超大問題的排查與解決

    mysql自增id超大問題的排查與解決

    這篇文章主要給大家介紹了關(guān)于mysql自增id超大問題的排查與解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • MySQL中將一列以逗號分隔的值行轉(zhuǎn)列的實現(xiàn)

    MySQL中將一列以逗號分隔的值行轉(zhuǎn)列的實現(xiàn)

    這篇文章主要介紹了MySQL中將一列以逗號分隔的值行轉(zhuǎn)列的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • mysql執(zhí)行sql文件報錯Error: Unknown storage engine‘InnoDB’的解決方法

    mysql執(zhí)行sql文件報錯Error: Unknown storage engine‘InnoDB’的解決方法

    最近在執(zhí)行一個innoDB類型sql文件的時候,發(fā)現(xiàn)系統(tǒng)報錯了,通過查找相關(guān)的資料終于解決了,所以下面這篇文章主要給大家介紹了關(guān)于mysql執(zhí)行sql文件時報錯Error: Unknown storage engine 'InnoDB'的解決方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • MySQL觸發(fā)器 Update觸發(fā)Insert失敗

    MySQL觸發(fā)器 Update觸發(fā)Insert失敗

    這篇文章主要介紹了MySQL觸發(fā)器 Update觸發(fā)Insert失敗 的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • 用percona-toolkit為MySQL收集系統(tǒng)和性能信息的教程

    用percona-toolkit為MySQL收集系統(tǒng)和性能信息的教程

    這篇文章主要介紹了用percona-toolkit為MySQL收集系統(tǒng)和性能信息的教程,可以輕松地將服務(wù)器基本信息錄入數(shù)據(jù)庫,需要的朋友可以參考下
    2015-11-11
  • mysql unique option prefix myisam_recover instead of myisam-recover-options的解決方法

    mysql unique option prefix myisam_recover instead of myisam-

    Using unique option prefix myisam_recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead
    2016-05-05
  • Mysql 錯誤問題匯總(不斷更新中)

    Mysql 錯誤問題匯總(不斷更新中)

    Mysql 錯誤問題匯總,我們在開發(fā)過程中經(jīng)??吹絤ysql的一些錯誤,這里整理下,方便需要的朋友
    2012-07-07
  • 一文弄懂MYSQL如何列轉(zhuǎn)行

    一文弄懂MYSQL如何列轉(zhuǎn)行

    最近工作中用到了好幾次列轉(zhuǎn)行,索性做個小總結(jié),下面這篇文章主要給大家介紹了關(guān)于MYSQL如何列轉(zhuǎn)行的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • MySQL轉(zhuǎn)換Oracle的需要注意的七個事項

    MySQL轉(zhuǎn)換Oracle的需要注意的七個事項

    有很多應(yīng)用項目, 剛起步的時候用MySQL數(shù)據(jù)庫基本上能實現(xiàn)各種功能需求,隨著應(yīng)用用戶的增多,數(shù)據(jù)量的增加,MySQL漸漸地出現(xiàn)不堪重負的情況:連接很慢甚至宕機,于是就有MySQL轉(zhuǎn)換Oracle的需求,應(yīng)用程序也要相應(yīng)做一些修改。
    2010-12-12
  • 淺析MySQL的基數(shù)統(tǒng)計

    淺析MySQL的基數(shù)統(tǒng)計

    這篇文章主要介紹了MySQL的基數(shù)統(tǒng)計的相關(guān)資料,幫助大家更好的理解和學習MySQL數(shù)據(jù)庫的使用,感興趣的朋友可以了解下
    2020-11-11

最新評論

桂阳县| 凤山县| 图木舒克市| 新郑市| 万荣县| 井陉县| 固原市| 泰和县| 吕梁市| 特克斯县| 海伦市| 建平县| 永年县| 堆龙德庆县| 益阳市| 介休市| 什邡市| 友谊县| 千阳县| 宣威市| 繁昌县| 榆林市| 巫山县| 临汾市| 张家界市| 莒南县| 平度市| 太白县| 新巴尔虎左旗| 抚宁县| 宜都市| 清水县| 榆社县| 金乡县| 长汀县| 英超| 宿迁市| 桂林市| 岳普湖县| 怀宁县| 城固县|