mysql體系結構 儲存檔案和sql語句的執行流程

2021-10-21 04:39:57 字數 4151 閱讀 3499

目錄

網路連線層

服務層儲存引擎層

儲存引擎相關命令

系統檔案層

表結構定義和資料檔案

日誌檔案

sql執行流程

連線狀態

mysql查詢高速緩衝

查詢高速緩衝如何工作

不會快取的情況

快取引數

mysql 從概念上分為四層,這四層自頂向下分別是網路連線層,服務層(核心層),儲存引擎層,系統檔案層。

主要負責連線管理、授權認證、安全等等。

第二層服務層是 mysql 的核心,mysql 的核心服務層都在這一層,查詢解析,sql 執行計畫分析,sql 執行計畫優化,查詢快取。以及跨儲存引擎的功能都在這一層實現:儲存過程,觸發器,檢視等。

show engines:檢視 mysql 支援的儲存引擎。

show table status:檢視當前庫中的表使用的是什麼儲存引擎。

系統檔案層包含資料、索引、錯誤日誌、查詢記錄、慢查詢日誌等。

在安裝 mysql 的時候會生成乙個 data 目錄,這個目錄就是 mysql 的資料檔案路徑,通過在配置檔案中的 datadir 引數配置,一般情況下,不要把 mysql 的資料檔案路徑配置在 mysql 的安裝目錄下。

在 mysql 的資料檔案路徑下,乙個 database 對應乙個資料夾,每張表對應一組檔案,不同儲存引擎的表檔案是不一樣的,下面看下innodb和myisam兩種儲存引擎資料庫對應的檔案目錄結構。

innodb的檔案目錄

.frm:表結構定義檔案。

db.opt:記錄這個庫的預設使用的字符集和校驗規則。

資料檔案(儲存表資料和索引)有兩種:ibd 和 ibdata,innodb 儲存引擎有兩種表空間方式:獨享表空間和共享表空間。

• 獨享表空間:使用 .ibd 檔案來存放資料,且每一張 innodb 表對應乙個 .ibd 檔案。

• 共享表空間:使用 .ibdata 檔案,所有表共同使用乙個(或多個,自行配置).ibdata 檔案。

myisam的檔案目錄

.frm:表結構定義檔案。

db.opt:記錄這個庫的預設使用的字符集和校驗規。

.myd:myd檔案存放 myisam 表的資料(data)。

.myi: 存放 myisam 表的索引相關資訊。

包含錯誤日誌、慢查詢日誌、通用查詢日誌、二進位制日誌等。下面只看下提到的這幾種檔案的配置

錯誤日誌:mysql 錯誤日誌記錄 mysql 執行過程中較為嚴重的警告和錯誤資訊,以及 mysql 每次啟動和關閉的詳細資訊。預設名是:機器名.err

慢查詢日誌:將執行超過某個時間閾值的 sql 語句記錄到檔案,預設檔名是:機器名-slow.log。

二進位制日誌:mysql 的二進位制日誌(binary log)是乙個二進位制檔案,主要用於記錄修改資料或有可能引起資料變更的 mysql 語句。二進位制日誌(binary log)中記錄了對 mysql 資料庫執行更改的所有操作,並且記錄了語句發生時間、執行時長、運算元據等其它額外資訊,但是它不記錄 select、show 等那些不修改資料的 sql 語句。二進位制日誌(binary log)主要用於資料庫恢復和主從複製。

當客戶端向 mysql 傳送乙個請求的時候,mysql 的執行過程如下圖所示:

對於乙個 mysql 的連線,或者說乙個執行緒,時刻都有乙個狀態來標識這個連線正在做什麼。可以通過如下命令來檢視連線的狀態:

show full processlist   或者  show processlist

這裡簡單介紹幾個常用的連線狀態:

sleep:執行緒正在等待客戶端傳送資料。

query:連線線程正在執行查詢。

locked:執行緒正在等待表鎖的釋放。

sorting result:執行緒正在對結果進行排序。

sending data:向請求端返回資料。

對於出現問題的連線可以通過 kill 的方式進行殺掉。

當乙個查詢語句進入mysql伺服器時,先去查詢快取中有沒有對應的查詢語句,如果沒有繼續向下執行,直到將結果返回,同時快取查詢語句和返回結果,如果有的話直接返回查詢結果,注意下下面的兩個查詢被查詢快取認為是不相同的:

select * from tbl_name 與  select * from tbl_name 

查詢必須是完全相同的(逐字節相同)才能夠被認為是相同的。另外,同樣的查詢字串由於其它原因可能認為是不同的。使用不同的資料庫、不同的協議版本或者不同 預設字符集的查詢被認為是不同的查詢並且分別進行快取。

如果乙個表被更改了,那麼使用那個表的所有緩衝查詢將不再有效,並且從緩衝區中移出。乙個表可以被許多態別的語句更改,例如insert、update、delete、truncate、alter table、drop table或drop database。

在下面的這些條件下,查詢也不會被快取:

當查詢語句中設定了 sql_no_cache,則不會被快取。

查詢語句中有一些不確定的資料時,則不會被快取。如包含函式 now() ,current_date() 等類。

當查詢的結果大於 query_cache_limit 設定的值時,結果不會被快取。

對於 innodb 引擎來說,當乙個語句在事務中修改了某個表,那麼在這個事務提交之前,所有與這個表相關的查詢都無法被快取。

引用自定義函式(udfs)。

引用自定義變數。

引用mysql系統資料庫中的表。

查詢語句不涉及到表。

下面方式中的任何一種:

select ...in share mode/select ...for update/
mysql 的快取引數在配置檔案中設定,可以通過如下命令來檢視快取的引數:

指定單個查詢能夠使用的緩衝區大小。

通過query_cache_type變數開啟關閉快取。

如果query_cache_type系統變數的值是on(1)或demand(2)開啟了快取(off/0關閉快取),那麼指定sql_cache的查詢結果將被快取,指定sql_no_cache的查詢結果不會快取,如:

select sql_cache id, name from customer; -- 會快取
select sql_no_cache id, name from customer; -- 不會快取
更多快取相關的配置參考:

1. 在查詢之前必須先檢查是否命中快取,浪費計算資源。

2. 針對表進行寫入或更新資料時,將對應表的所有快取都設定失效。

3.如果這個查詢可以被快取,那麼執行完成後,mysql 發現查詢快取中沒有這個查詢,則會將結果存入查詢快取,這會帶來額外的系統消耗。

MySQL儲存引擎體系結構

mysql採用外掛程式式儲存體系結構。提供到儲存引擎有 myisam 預設的mysql外掛程式式儲存引擎,它是在web,資料倉儲和其他應用環境下最常用的儲存引擎之一。通過更改storage engine配置變數能夠方便地更改mysql伺服器的預設儲存引擎。innodb 用於事物處理應用程式,具有眾多...

MySQL 儲存引擎體系結構

最上層是一些客戶端和連線服務,包含本地 sock 通訊和大多數基於客戶端 服務端工具實現的類似於 tcp ip 的通訊。主要完成一些類似於連線處理 授權認證 及相關的安全方案。在該層上引入了執行緒池的概念,為通過認證安全接入的客戶端提供執行緒。同樣在該層上可以實現基於 ssl 的安全鏈結。伺服器也會...

mysql 體系結構 了解MySQL體系結構

mysql 資料庫體系結構圖 mysql 由以下幾部分組成 1 connectors 不同語言中與 sql 的互動 show variables like connection variable name value character set connection utf8 collation c...