MySQL - 相關概念
連線
MySQL提供了兩種連線方式:
- TCP/IP方式(本地、遠端):
mysql -uroot -p123 -h 10.0.0.1 -P330
- Socket方式(僅本地)
mysql -uroot -p123 -S /tmp/mysql.sock
當我們本地連線MySQL的時候,預設用的是socket方式,一般在配置檔案中有體現:
[root@cs /]# cat /etc/my.cnf [mysqld] user=mysql basedir=/opt/mysql datadir=/data/mysql server_id=6 port=3306 socket=/tmp/mysql.sock [mysql] socket=/tmp/mysql.sock prompt=3306 [\\d]>
如上socket
指向的/tmp/mysql.sock
檔案就是socket檔案,通過這個檔案進行連線;我們也能在本地找到這個檔案:
[root@cs /]# ll /tmp/mysql.sock srwxrwxrwx 1 mysql mysql 0 8月 14 16:28 /tmp/mysql.sock
例項
MySQL例項由以下幾部分組成:
- MySQL後臺守護程序
- Master Thread
- Work Thread
- 預分配的記憶體
一臺物理機上,通常可以部署一個例項;當然為了最大化的利用硬體效能,也可以部署多個例項。
MySQL架構
MySQL架構總共四層:
-
首先,最上層的服務並不是MySQL獨有的,大多數給予網路的客戶端/伺服器的工具或者服務都有類似的架構。比如:連線處理、授權認證、安全等。
-
第二層的架構包括大多數的MySQL的核心服務。包括:查詢解析、分析、優化、快取以及所有的內建函式(例如:日期、時間、數字和加密函式)。同時,所有的跨儲存引擎的功能都在這一層實現:儲存過程、觸發器、檢視等。
-
第三層包含了儲存引擎。儲存引擎負責MySQL中資料的儲存和提取。伺服器通過API和儲存引擎進行通訊。這些介面遮蔽了不同儲存引擎之間的差異,使得這些差異對上層的查詢過程透明化。儲存引擎API包含十幾個底層函式,用於執行“開始一個事務”等操作。但儲存引擎一般不會去解析SQL(InnoDB會解析外來鍵定義,因為其本身沒有實現該功能),不同儲存引擎之間也不會相互通訊,而只是簡單的響應上層的伺服器請求。
-
第四層包含了檔案系統,所有的表結構和資料以及使用者操作的日誌最終還是以檔案的形式儲存在硬碟上。
MySQL中一條SQL的執行過程:
-
由客戶端向mysqld傳送SQL語句
-
連線層
- 提供連線協議:TCP/IP、SOCKET
- 提供驗證:使用者、密碼、IP、SOCKET
- 提供專用連線執行緒:接收SQL、返回結果,我們可以通過下面的語句來檢視到當前有幾個客戶端連線:
-
SQL層:
- 接收上層傳送過來的SQL語句
- 語法驗證模組:驗證語句語法,是否滿足
SQL_MODE
- 語義檢查:判斷SQL語句的型別
- DDL:資料定義語言
- DCL:資料控制語言
- DML:資料操作語言
- DQL:資料查詢語言
- .........
- 許可權檢查:使用者對庫表有沒有相關許可權
- 解析器:進行SQL預處理,產生執行計劃
- 優化器:根據解析器得出多種執行計劃,進行選擇最優的執行計劃
- 代價模型:資源(CPU、IO、MEM)的損耗評估效能情況
- 執行器:根據最優執行計劃,執行SQL語句,產生執行結果,資料在磁碟的某個位置上
- 根據查詢快取(預設是關閉的),會使用redis、tair替代查詢快取功能
- 提供日誌記錄:binlog,預設是關閉的
-
儲存引擎層(類似Linux中的檔案系統):根據SQL層執行的結果,從磁碟上拿資料,將16進位制的磁碟資料,交由SQL結構化成表,由連線層的專用執行緒返回給使用者
邏輯結構
在MySQL中,邏輯結構由庫和表組成,並且各自有各自的規範:
- 庫:
- 庫名稱
- 庫屬性
- 表(二維表):
- 表名
- 表屬性
- 列:列名、列屬性
- 資料行,也叫記錄
庫的物理結構
庫相當於目錄(資料夾)
表的物理結構
在磁碟上,表的物理儲存根據儲存引擎的不同而有所不同,目前常用的有兩種:
MyIASM:
- user.frm:儲存列相關資訊
- user.MYD:儲存記錄
- user.MYI:索引
INNODB:
- frm:儲存列相關資訊
- ibd:資料行和索引資訊
如上示例是兩種不同儲存引擎的表的物理結構。
我們可以對應來理解:
- 資料庫相當於資料夾。
- 資料表相當於資料夾內的Excel表。
- 記錄相當於Excel表中的一行行資料。
只不過MySQL對這些有更嚴格的規範
常用的SQL分類
- DDL(Data Definition Language):資料定義語言,就是我們在建立表的時候用到的一些sql,比如說:CREATE、ALTER、DROP等。DDL主要是用在定義或改變表的結構,資料型別,表之間的連結和約束等初始化工作上。
- DCL(Data Control Language):資料控制語言,是用來設定或更改資料庫使用者或角色許可權的語句,包括(grant,deny,revoke等)語句。這個比較少用到。
- DML(Data Manipulation Language):資料操作語言,就是我們最經常用到的 SELECT、UPDATE、INSERT、DELETE。 主要用來對資料庫的資料進行一些操作。