第1章 MySQL 體系結(jié)構(gòu)和存儲(chǔ)引擎

1.1 定義數(shù)據(jù)庫和實(shí)例

數(shù)據(jù)庫:物理操作系統(tǒng)文件或其他形式文件類型的集合。在 MySQL 數(shù)據(jù)庫中,數(shù)據(jù)庫文件可以是 frm、MYD、MYI、ibd 結(jié)尾的文件。

實(shí)例:MySQL 數(shù)據(jù)庫由后臺(tái)線程以及一個(gè)共享內(nèi)存區(qū)組成。共享內(nèi)存區(qū)可以被運(yùn)行的后臺(tái)線程所共享。需要牢記的是,==數(shù)據(jù)庫實(shí)例才是真正用于操作數(shù)據(jù)庫文件的==。

一個(gè)數(shù)據(jù)庫對(duì)應(yīng)一個(gè)實(shí)例,但是,在集群情況下可能存在一個(gè)數(shù)據(jù)庫被多個(gè)數(shù)據(jù)實(shí)例使用的情況。

通過命令 ps 觀察 MySQL 數(shù)據(jù)庫啟動(dòng)后的進(jìn)程情況:ps -ef | grep mysqld

用以下命令可以查看當(dāng) MySQL 數(shù)據(jù)庫實(shí)例啟動(dòng)時(shí),會(huì)在哪些位置查找配置文件

?  ~ mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 

如果幾個(gè)配置文件中都有同一個(gè)參數(shù),MySQL 數(shù)據(jù)庫會(huì)以讀取到的最后一個(gè)配置文件的參數(shù)為準(zhǔn)。

在沒有配置文件的情況下,MySQL 會(huì)按照編譯時(shí)的默認(rèn)參數(shù)設(shè)置啟動(dòng)實(shí)例。

配置文件中有一個(gè)參數(shù) datadir,該參數(shù)指定了數(shù)據(jù)庫所在的路徑。

mysql> SHOW VARIABLES LIKE 'datadir';
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| datadir       | /usr/local/mysql/data/ |
+---------------+------------------------+
1 row in set (0.03 sec)

1.2 MySQL 體系結(jié)構(gòu)

從概念上來說,數(shù)據(jù)庫是文件的集合,是依照某種數(shù)據(jù)模型組織起來并存放于二級(jí)存儲(chǔ)器(如磁盤)中的數(shù)據(jù)集合;數(shù)據(jù)庫實(shí)例是程序,是位于用戶與操作系統(tǒng)之間的一層數(shù)據(jù)管理軟件,用戶對(duì)數(shù)據(jù)庫數(shù)據(jù)的任何操作,包括數(shù)據(jù)庫定義、數(shù)據(jù)查詢、數(shù)據(jù)維護(hù)、數(shù)據(jù)庫運(yùn)行控制等都是在數(shù)據(jù)庫實(shí)例下進(jìn)行的,應(yīng)用程序通過數(shù)據(jù)庫實(shí)例才能和數(shù)據(jù)庫打交道。

MySQL 由以下幾部分組成:

  • 連接池組件
  • 管理服務(wù)和工具組件
  • SQL 接口組件
  • 查詢分析器組件
  • 優(yōu)化器組件
  • 緩沖(Cache)組件
  • 插件式存儲(chǔ)引擎
  • 物理文件

==需要特別注意的是,存儲(chǔ)引擎是基于表的,而不是數(shù)據(jù)庫。==

1.3 MySQL 存儲(chǔ)引擎

MySQL 官方手冊(cè)的第 16 章給出了編寫自定義存儲(chǔ)引擎的過程。

由于 MySQL 數(shù)據(jù)庫開源特性,存儲(chǔ)引擎可以分為 MySQL 官方存儲(chǔ)引擎和第三方存儲(chǔ)引擎。

1.3.1 InnoDB 存儲(chǔ)引擎

InnoDB 存儲(chǔ)引擎支持事務(wù),其設(shè)計(jì)目標(biāo)主要面向==在線事務(wù)處理== (OLTP) 的應(yīng)用。其特點(diǎn)是==行鎖設(shè)計(jì)、支持外鍵==,并支持類似于 Oracle 的非鎖定讀,即==默認(rèn)讀取操作不會(huì)產(chǎn)生鎖==。

InnoDB 通過使用多版本并發(fā)控制 (MVCC) 來獲得高并發(fā),并且實(shí)現(xiàn)了 SQL 標(biāo)準(zhǔn)的 4 種隔離級(jí)別,默認(rèn)為 REPEATABLE 級(jí)別。同時(shí),使用一種被稱為 next-key locking 的策略來避免幻讀 (phantom) 現(xiàn)象的產(chǎn)生。

除此之外,InnoDB 存儲(chǔ)引擎還提供了插入緩沖 (insert buffer)、二次寫 (double write)、自適應(yīng)哈希索引 (adaptive hash index)、預(yù)讀 (read ahead) 等高性能和高可用功能。

1.3.2 MyISAM 存儲(chǔ)引擎

MyISAM 存儲(chǔ)引擎==不支持事務(wù)、表鎖設(shè)計(jì),支持全文索引==,主要面向一些 OLAP 數(shù)據(jù)庫應(yīng)用。

此外,MyISAM 存儲(chǔ)引擎的另一個(gè)與眾不同的地方是它的緩沖池==只緩存 (cache) 索引文件,而不緩沖數(shù)據(jù)文件==。

MyISAM 存儲(chǔ)引擎表由 MYD 和 MYI 組成,MYD 用于存放數(shù)據(jù)文件,MYI 用于存放索引文件。

1.3.3 NDB 存儲(chǔ)引擎

NDB 的特點(diǎn)是數(shù)據(jù)全部存放在內(nèi)存中,因此主鍵查找 (primary key lookups) 的速度極快,并且通過添加 NDB 數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn) (Data Node) 可以線性地提高數(shù)據(jù)庫性能,是高可用、高性能的集群系統(tǒng)。

1.3.4 Memory 存儲(chǔ)引擎

Memory 存儲(chǔ)引擎將表中的數(shù)據(jù)存放在內(nèi)存中,如果數(shù)據(jù)庫重啟或發(fā)生崩潰,表中的數(shù)據(jù)都將消失。

1.4 各存儲(chǔ)引擎之間的比較

MySQL_各存儲(chǔ)引擎之間的比較.png

可以通過 SHOW ENGINES 語句查看當(dāng)前使用的 MySQL 數(shù)據(jù)庫所支持的存儲(chǔ)引擎,也可以通過查找 information_schema 架構(gòu)下的 ENGINES 表。

mysql> SHOW ENGINES;
MySQL_SHOW_ENGINES.png
mysql> CREATE TABLE mytest Engine=MyISAM AS SELECT * FROM inc;

可以統(tǒng)計(jì)使用各存儲(chǔ)引擎后表的大小。

1.5 連接 MySQL

連接 MySQL 操作是一個(gè)連接進(jìn)程和 MySQL 數(shù)據(jù)庫實(shí)例進(jìn)行通信,本質(zhì)上是進(jìn)程通信。

常用的進(jìn)程通信方式有管道、命名管道、命名字、TCP/IP 套接字、UNIX 域套接字。

1.5.1 TCP/IP

TCP/IP 套接字方式是 MySQL 數(shù)據(jù)庫在任何平臺(tái)下都提供的連接方式,也是網(wǎng)絡(luò)中使用得最多的一種方式。

例如:用戶在 Windows 服務(wù)器下請(qǐng)求一臺(tái)遠(yuǎn)程 Linux 服務(wù)器下的 MySQL 實(shí)例:

mysql -h192.168.0.101 -u root -p

在桐高 TCP/IP 連接到 MySQL 實(shí)例時(shí),MySQL 數(shù)據(jù)庫會(huì)先檢查一張權(quán)限視圖,用來判斷發(fā)起請(qǐng)求的客戶端 IP 是否允許連接到 MySQL 實(shí)例。

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select user,host from user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)

1.5.2 命名管道和共享內(nèi)存

在 Windows 環(huán)境下,如果兩個(gè)需要進(jìn)程通信的進(jìn)程在同一臺(tái)服務(wù)器上,那么可以使用命名管道,Microsoft SQL Server 數(shù)據(jù)庫默認(rèn)安裝后的本地連接也是使用命名管道。

1.5.3 UNIX 域套接字

在 Linux 和 UNIX 環(huán)境下,還可以使用 UNIX 域套接字。

用戶可以在配置文件中指定套接字文件路徑,如 —socket=/tmp/mysql.sock。當(dāng)數(shù)據(jù)庫實(shí)例啟動(dòng)后,用戶可以通過下列命令來進(jìn)行 UNIX 域套接字文件的查找。

mysql> show VARIABLES LIKE "socket";
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| socket        | /tmp/mysql.sock |
+---------------+-----------------+
1 row in set (0.04 sec)

在知道了 UNIX 域套接字文件的路徑后,就可以使用以下方式進(jìn)行連接了:

mysql -udavid -S /tmp/mysql.sock

1.6 小結(jié)

  • 區(qū)分實(shí)例與數(shù)據(jù)庫的區(qū)別
  • MySQL 插件式存儲(chǔ)引擎的概念
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容