天天看點

【轉載】資料庫 | mysql 查詢

MySQL中的表連接配接(外連接配接、内連接配接、交叉連接配接、自連接配接)

資料庫在通過連接配接兩張或多張表來傳回記錄時,都會生成一張中間的臨時表,然後再将這張臨時表傳回給使用者。 在使用left jion時,on和where條件的差別如下:

1、on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會傳回左邊表中的記錄。

2、where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須傳回左邊表的記錄)了,條件不為真的就全部過濾掉。

【轉載】資料庫 | mysql 查詢

1、Mysql可以分為Server層和存儲引擎層兩部分。

2、Server層:包含連接配接器,查詢緩存,分析器,優化器,執行器等,涵蓋了MySQL的大多數核心功能區以及所有的内置函數。

①内置函數:日期,時間,數學和加密函數等;

②所有跨存儲引擎的功能都在這一層實作,例如存儲過程,觸發器,視圖等;

3、存儲引擎層:負責資料的存儲和提取。

①架構模式:插件式的,支援InnoDB(目前也是最常用的,MySQL5.5後預設存儲引擎)、MyISAM、Memory等多個存儲引擎。

②create table 時不指定引擎類型,預設使用的就是InnoDB.如果使用其他類型,可以利用create table語句中使用engine=memory,等來指定使用記憶體引擎來建立表。不同的存儲引擎資料存儲方式不同,支援的功能也不同。

4、不同的存儲引擎共用一個server層,結合一個例子我們從總體上了解一下各部件的功能。

詳細檢視:MySQL基礎架構

用戶端

控制工具 mysql 用來管理資料庫,備份,恢複,安全控制等等

  • 連接配接池 管理緩沖使用者連接配接,線程處理等需要緩存的需求
  • sql接口 并且傳回使用者需要查詢的結果,比如select from
  • 解析器 sql指令分解成資料結構
  • 優化器 查詢之前,對sql查詢語句進行優化。使用’選取-投影-聯接’政策進行查詢

    select uid,name from user where gender = 1;

    查詢步驟:

    where語句選取,而不是全部查詢,再gender過濾

    根據uid和name屬性投影,而不是将屬性全部取出,再過濾

    兩個查詢條件聯接起來生成最終查詢結果

    查詢緩存

    如果查詢緩存有命中的查詢結果,查詢語句就可以直接去查詢緩存中取資料

    這個緩存機制是由一系列小緩存組成的,比如表緩存,記錄緩存,key緩存,權限緩存

【轉載】資料庫 | mysql 查詢

連接配接者:不同語言的代碼程式和mysql的互動(SQL互動)

1、連接配接池 管理、緩沖使用者的連接配接,線程處理等需要緩存的需求

2、管理服務和工具元件 系統管理和控制工具,例如備份恢複、Mysql複制、叢集等

3、sql接口 接受使用者的SQL指令,并且傳回使用者需要查詢的結果

4、查詢解析器 SQL指令傳遞到解析器的時候會被解析器驗證和解析(權限、文法結構)

5、查詢優化器 SQL語句在查詢之前會使用查詢優化器對查詢進行優化

select id,name from user where age = 40;

a、這個select 查詢先根據where 語句進行選取,而不是先将表全部查詢出來以後再進行age過濾

b、這個select查詢先根據id和name進行屬性投影,而不是将屬性全部取出以後再進行過濾

c、将這兩個查詢條件聯接起來生成最終查詢結果

6、緩存 如果查詢緩存有命中的查詢結果,查詢語句就可以直接去查詢緩存中取資料

7、插入式存儲引擎 存儲引擎說白了就是如何管理操作資料(存儲資料、如何更新、查詢資料等)的一種方法。因為在關系資料庫

中資料的存儲是以表的形式存儲的,是以存儲引擎也可以稱為表類型(即存儲和操作此表的類型)

連接配接池

上MySQL中的連接配接池就是維護了與系統之間的多個資料庫連接配接。除此之外,你的系統每次跟MySQL建立連接配接的時候,還會根據你傳遞過來的賬号和密碼,進行賬号密碼的驗證,庫表權限的驗證。

我們的系統采用資料庫連接配接池的方式去并發通路資料庫,然後資料庫自己其實也會維護一個連接配接池,其中管理了各種系統跟這台資料庫伺服器建立的所有連接配接。

【轉載】資料庫 | mysql 查詢

把MySQL當個黑盒子一樣執行SQL語句

我們可以通過資料庫連接配接把要執行的SQL語句發送給MySQL資料庫。大多數人完全當他是個黑盒子,來建表以及執行SQL語句

網絡連接配接必須讓線程來處理

完全當他是個黑盒子,來建表以及執行SQL語句。

網絡連接配接必須得配置設定給一個線程去進行處理,由一個線程來監聽請求以及讀取請求資料,比如從網絡連接配接中讀取和解析出來一條我們的系統發送過去的SQL語句,如下圖所示

【轉載】資料庫 | mysql 查詢

SQL接口:負責處理接收到的SQL語句

當MySQL内部的工作線程從一個網絡連接配接中讀取出來一個SQL語句之後,此時會如何來執行這個SQL語句呢?

如果你要去執行這個SQL語句,去完成底層資料的增删改查,那這就是一項極度複雜的任務了!

是以MySQL内部首先提供了一個元件,就是SQL接口(SQL Interface),他是一套執行SQL語句的接口,專門用于執行我們發送給MySQL的那些增删改查的SQL語句

是以MySQL的工作線程接收到SQL語句之後,就會轉交給SQL接口去執行,如下圖。

【轉載】資料庫 | mysql 查詢

解析器:讓MySQL能看懂SQL語句

這個查詢解析器(Parser)就是負責對SQL語句進行解析的,比如對上面那個SQL語句進行一下拆解,拆解成以下幾個部分:

  • 我們現在要從“users”表裡查詢資料
  • 查詢“id”字段的值等于1的那行資料
  • 對查出來的那行資料要提取裡面的“id,name,age”三個字段。
【轉載】資料庫 | mysql 查詢

優化器

選擇最優的查詢路徑

當我們通過解析器了解了SQL語句要幹什麼之後,接着會找查詢優化器(Optimizer)來選擇一個最優的查詢路徑

【轉載】資料庫 | mysql 查詢

調用存儲引擎接口,真正執行SQL語句

最後一步,就是把查詢優化器選擇的最優查詢路徑,也就是你到底應該按照一個什麼樣的順序和步驟去執行這個SQL語句的計劃,把這個計劃交給底層的存儲引擎去真正的執行。

不知道大家是否思考過,真正在執行SQL語句的時候,要不然是更新資料,要不然是查詢資料,那麼資料你覺得存放在哪裡?

資料庫也不是什麼神秘莫測的東西,你可以把他了解為本身就是一個類似你平時寫的圖書館管理系統

緩存

資料庫自己就是一個程式設計語言寫出來的系統而已,然後啟動之後也是一個程序,執行他裡面的各種代碼,也就是我們上面所說的那些東西。是以對資料庫而言,我們的資料要不然是放在記憶體裡,要不然是放在磁盤檔案裡,沒什麼特殊的地方!

【轉載】資料庫 | mysql 查詢

我們已經知道一個SQL語句要如何執行了,但是我們現在怎麼知道哪些資料在記憶體裡?哪些資料在磁盤裡?我們執行的時候是更新記憶體的資料?還是更新磁盤的資料?我們如果更新磁盤的資料,是先查詢哪個磁盤檔案,再更新哪個磁盤檔案?

存儲引擎

是不是感覺一頭霧水是以這個時候就需要存儲引擎了,存儲引擎其實就是執行SQL語句的,他會按照一定的步驟去查詢記憶體緩存資料,更新磁盤資料,查詢磁盤資料,等等,執行諸如此類的一系列的操作,如下圖所示。

【轉載】資料庫 | mysql 查詢

MySQL的架構設計中,SQL接口、SQL解析器、查詢優化器其實都是通用的,他就是一套元件而已。

但是存儲引擎的話,他是支援各種各樣的存儲引擎的,比如我們常見的InnoDB、MyISAM、Memory等等,我們是可以選擇使用哪種存儲引擎來負責具體的SQL語句執行的。

當然現在MySQL一般都是使用InnoDB存儲引擎的,至于存儲引擎的原理,後續我們也會深入一步一步分析,大家不必着急。

執行器:根據執行計劃調用存儲引擎的接口

我們回過頭來思考一個問題,存儲引擎可以幫助我們去通路記憶體以及磁盤上的資料,那麼是誰來調用存儲引擎的接口呢?

這個執行器會根據優化器選擇的執行方案,去調用存儲引擎的接口按照一定的順序和

步驟,就把SQL語句的邏輯給執行了

舉個例子,比如執行器可能會先調用存儲引擎的一個接口,去擷取“users”表中的第一行資料,然後判斷一下這個資料的“id”字段的值是否等于我們期望的一個值,如果不是的話,那就繼續調用存儲引擎的接口,去擷取“users”表的下一行資料。

就是基于上述的思路,執行器就會去根據我們的優化器生成的一套執行計劃,然後不停的調用存儲引擎的各種接口去完成SQL語句的執行計劃,大緻就是不停的更新或者提取一些資料出來

【轉載】資料庫 | mysql 查詢