1. 程式人生 > >mysql聯合查詢分析及優化

mysql聯合查詢分析及優化

最近在做報表,跟資料庫打交道的比較多,所以特意來總結一下mysql的聯合查詢;

查詢常用的字句

    where(條件查詢)、having(篩選)、group by(分組)、order by(排序)、limit(分頁)USING(取交集) 1、where常用運算子: 一般跟在from後面,通常會和條件運算子到一起使用   比較運算子                 > ,  < ,=  , != (< >),>=   ,   <=                   in(v1,v2..vn)                   between v1 and v2    在v1至v2之間(包含v1,v2)             邏輯運算子                 not ( ! )  邏輯非                 or ( || )    邏輯或                 and ( && )  邏輯與                 where price>=3000 and price <= 5000 or price >=500 and price <=1000                  取500-1000或者3000-5000的值                 where price not between 3000 and 5000                 不在3000與5000之間的值             模糊查詢                 like 像                 萬用字元:                 %  任意字元                 _   單個字元

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

 例如:

SELECT FROM LEFT JOIN USING ()

連線多於兩個表的情況舉例:


多表連線查詢

 1笛卡爾積(交叉連線) MySQL中可以為CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: 
SELECT * FROM table1 CROSS JOIN table2   
SELECT * FROM table1 JOIN table2   
SELECT * FROM table1,table2  

表示以前用的最多的就是使用','了,由於其返回的結果為被連線的兩個資料表的乘積,因此當有WHERE, ON或USING條件的時候一般不建議使用,因為當資料表專案太多的時候,會非常慢。但是如果不用where的話,怎麼去關聯兩張表啦,一般查詢主表和字表的時候可以使用這個方法比如
<pre name="code" class="sql">select*from table1 t1,table2 t2 where t1.id=t2.id  

如果多表的情況下我們最好使用LEFT [OUTER] JOIN或者RIGHT [OUTER] JOIN;

2.內連線INNER JOIN 在MySQL中把INNER JOIN叫做等值連線,即需要指定等值連線條件在MySQL中CROSS和INNER JOIN被劃分在一起。

select*from table1 t1 inner join table2 t2 on t1.id=t2.id 
內連線使用ON子句指定兩個表的連線條件,WHERE子句來指定條件子句。

這一段程式碼等價與上面那段程式碼;

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

例子:

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的紀錄,但是沒有在結果中出現,
而user表中的id=3, name=daodao的使用者在user_action中沒有相應的紀錄,但是卻出現在了結果集中
因為現在是left join,所有的工作以left為準.
結果1,2,3,4都是既在左表又在右表的紀錄,5是隻在左表,不在右表的紀錄

工作原理:

從左表讀出一條,選出所有與on匹配的右表紀錄(n條)進行連線,形成n條紀錄(包括重複的行,如:結果1和結果3),如果右邊沒有與on條件匹配的表,那連線的欄位都是null.然後繼續讀下一條。

引申:
我們可以用右表沒有on匹配則顯示null的規律, 來找出所有在左表,不在右表的紀錄, 注意用來判斷的那列必須宣告為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應該用is null 而不能用=NULL
         2.這裡a.user_id 列必須宣告為 NOT NULL 的.


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

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

一般用法:

a. LEFT [OUTER] JOIN:

除了返回符合連線條件的結果之外,還需要顯示左表中不符合連線條件的資料列,相對應使用NULL對應

SELECT column_name FROM table1 LEFT [OUTER] JOIN table2 ON table1.column=table2.column  

b. RIGHT [OUTER] JOIN:

RIGHT與LEFT JOIN相似不同的僅僅是除了顯示符合連線條件的結果之外,還需要顯示右表中不符合連線條件的資料列,相應使用NULL對應

SELECT column_name FROM table1 RIGHT [OUTER] JOIN table2 ON table1.column=table2.column 

MySQL如何優化LEFT JOIN和RIGHT JOIN

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

1)·  根據表A和A依賴的所有表設定表B。

2)·  根據LEFT JOIN條件中使用的所有表(除了B)設定表A。

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

4)·  可以對所有標準聯接進行優化,只是只有從它所依賴的所有表讀取的表例外。如果出現迴圈依賴關係,MySQL提示出現一個錯誤。

5)· 進行所有標準WHERE優化。

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

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

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

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

[sql] view plain copy  print?
  1. SELECT *  
  2. FROM a,b LEFTJOIN c ON (c.key=a.keyLEFTJOIN d ON (d.key=a.key)  
  3. WHERE b.key=d.key;  

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

[sql] view plain copy  print?
  1. SELECT *  
  2. FROM b,a LEFTJOIN c ON (c.key=a.keyLEFTJOIN d ON (d.key=a.key)  
  3. WHERE b.key=d.key;  

MySQL可以進行下面的LEFT JOIN優化:如果對於產生的NULL行,WHERE條件總為假,LEFT JOIN變為普通聯接。

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

[sql] view plain copy  print?
  1. SELECT * FROM t1 LEFTJOIN t2 ON (column1) WHERE t2.column2=5;  

因此,可以安全地將查詢轉換為普通聯接:

[sql] view plain copy  print?
  1. SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;  

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

相關推薦

mysql聯合查詢分析優化

最近在做報表,跟資料庫打交道的比較多,所以特意來總結一下mysql的聯合查詢; 查詢常用的字句     where(條件查詢)、having(篩選)、group by(分組)、order by(排序)、limit(分頁)、USING(取交集) 1、where常用運算子

Mysql 多表聯合查詢效率分析優化

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

MySQL的limit用法和分頁查詢的性能分析優化

中間 復合索引 null sts 含義 設計模式 自然 而不是 mit 申明:本博文轉發於 點擊鏈接跳轉 一、limit用法在我們使用查詢語句的時候,經常要返回前幾條或者中間某幾行數據,這個時候怎麽辦呢?不用擔心,mysql已經為我們提供了這樣一個功能。 SELECT

mysql性能優化-慢查詢分析優化索引和配置【轉】

簡單的 ssi any 通過命令 字型 reat created 效果 tle 一、優化概述 二、查詢與索引優化分析 1性能瓶頸定位 Show命令 慢查詢日誌 explain分析查詢 profiling分析查詢 2索引及查詢優化 三、配置優化 1) max_c

MYSQL多表聯查效率分析優化

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!         &n

一次MySQL線上慢查詢分析索引使用

本文由作者鄭智輝授權網易雲社群釋出。 0.前言 本文通過分析線上MySQL慢查詢日誌,定位出現問題的SQL,進行業務場景分析,結合索引的相關使用進行資料庫優化。在兩次處理問題過程中,進行的思考。 1.簡要描述 在九月底某個新上的遊戲業務MySQL慢查詢日誌 # Time:

MySQL慢日誌功能分析優化增強

此文已由作者溫正湖授權網易雲社群釋出。歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。MySQL慢日誌(slow log)是MySQL DBA及其他開發、運維人員需經常關注的一類資訊。使用慢日誌可找出執行時間較長或未走索引等SQL語句,為進行系統調優提供依據。本文結合線上案

mysql查詢種類聯合查詢的sql語句寫法

子查詢: 將一個查詢語句巢狀在另一個查詢語句中,內層查詢語句的查詢結果可以作為外層查詢語句提供條件。 1.in ,not in 2.比較運算子>= select id,name from student where score >=(select level from s

mysql效能優化-慢查詢分析優化索引和配置 (慢查詢日誌,explain,profile)

一、優化概述 二、查詢與索引優化分析 1效能瓶頸定位 Show命令 慢查詢日誌 explain分析查詢 profiling分析查詢 2索引及查詢優化 三、配置優化 1)      max_connections 2)      back_log 3)      interactive_timeout 4)

mysql效能優化-慢查詢分析優化索引和配置

目錄 一、優化概述 二、查詢與索引優化分析 1效能瓶頸定位 Show命令 慢查詢日誌 explain分析查詢 profiling分析查詢 2索引及查詢優化 三、配置優化 1)      max_connections 2)      back_lo

(轉)MySQL查詢分析優化 + MySQL調優

優化 mysqldump 默認 database host show mysqld mysql 命令 1.long_query_time的默認值為10,意思是運行10S以上的語句。 2.臨時設置開啟慢查詢日誌 mysql> show variables lik

Mysql聯合查詢UNION和UNION ALL的使用介紹

組合 ans per ext 輸入 and nbsp 理解 des 一、UNION和UNION ALL的作用和語法 UNION 用於合並兩個或多個 SELECT 語句的結果集,並消去表中任何重復行。UNION 內部的 SELECT 語句必須擁有相同數量的列,列也必須擁有

MySQL性能分析explain的使用

索引 pri ... ons data 接下來 rom possible 聯合 MySQL性能分析及explain用法的知識是本文我們主要要介紹的內容,接下來就讓我們通過一些實際的例子來介紹這一過程,希望能夠對您有所幫助。 1.使用explain語句去查看分析結果 如e

MySQL聯合查詢和左關聯的區別

rand 定義 ges left join == sql img alt 我把這個定義為聯合查詢或者說並查詢: 第1種:SELECT a.gbname,b.gcontent FROM tb_goodsbrand a,tb_goods b WHERE a.gbid = b.g

mysql查詢分析工具和分析方法

mysql 慢查詢 分析工具 1.mysql慢查詢分析工具1.參考文檔:http://www.ttlsa.com/mysql/analyse-slow-query-log-using-anemometer/http://isadba.com/?p=655官方文檔:https://github.co

MySQL 聯合查詢

保留 div nio 例如 sql 女生 tree custom first 聯合查詢:將多次查詢(多條select語句), 在記錄上進行拼接(字段不會增加) 基本語法:多條select語句構成: 每一條select語句獲取的字段數必須嚴格一致(但是字段類型無關) 語法

MySQL性能分析explain的使用(轉)

行鎖 原則 註意 文檔 lac ref mys con targe 1、使用explain語句去查看分析結果,如 explain select * from test1 where id=1; 會出現: id selecttype table typ

PostgreSQL CPU滿(100%)性能分析優化(轉)

mark ike -- 過多 mar 是不是 影響 sas sql日誌 PostgreSQL CPU滿(100%)性能分析及優化 轉自:https://help.aliyun.com/knowledge_detail/43562.html 在數據庫運維當中,

MySQL多實例優化(二)

基本 文件 target mys lan 程序 16px 通過 讀寫分離 一、多實例MySQL數據庫原理   1.1:原理圖        1.2:多實例原理(什麽是多實例)     簡單來說MySQL多實例就是在一臺服務器上同時開啟多個不用的服務端口(如:3

【轉】【MySQLMysql模糊查詢like提速優化

app 有一個 使用 set table 存在 src instr 分享圖片 在使用msyql進行模糊查詢的時候,很自然的會用到like語句,通常情況下,在數據量小的時候,不容易看出查詢的效率,但在數據量達到百萬級,千萬級的時候,查詢的效率就很容易顯現出來。這個時候查詢的效