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ǔ)引擎之間的比較

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

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ǔ)引擎的概念