11 MySQL存儲引擎
11.1 MySQL體系結構
-
體系結構的概念
- 任何一套系統當中,每個部件都能起到一定的作用!
MySQL的體系結構
MySQL-11-01.png
- 體系結構詳解
- 客戶端連接
- 支持接口:支持的客戶端連接,例如C、Java、PHP等語言來連接MySQL數據庫
- 第一層:網絡連接層
- 連接池:管理、緩沖用戶的連接,線程處理等需要緩存的需求。
- 例如:當客戶端發送一個請求連接,會從連接池中獲取一個連接進行使用。
- 第二層:核心服務層
- 管理服務和工具:系統的管理和控制工具,例如備份恢復、復制、集群等。
- SQL接口:接受SQL命令,并且返回查詢結果。
- 查詢解析器:驗證和解析SQL命令,例如過濾條件、語法結構等。
- 查詢優化器:在執行查詢之前,使用默認的一套優化機制進行優化sql語句
- 緩存:如果緩存當中有想查詢的數據,則直接將緩存中的數據返回。沒有的話再重新查詢!
- 第三層:存儲引擎層
- 插件式存儲引擎:管理和操作數據的一種機制,包括(存儲數據、如何更新、查詢數據等)
- 第四層:系統文件層
- 文件系統:配置文件、數據文件、日志文件、錯誤文件、二進制文件等等的保存
- 客戶端連接
11.2 MySQL存儲引擎
-
引擎的概念
- 生活中,引擎就是整個機器運行的核心,不同的引擎具備不同的功能。
-
MySQL存儲引擎的概念
- MySQL數據庫使用不同的機制存取表文件 , 機制的差別在于不同的存儲方式、索引技巧、鎖定水平以及廣泛的不同的功能和能力,在MySQL中 , 將這些不同的技術及配套的功能稱為存儲引擎
- 在關系型數據庫中數據的存儲是以表的形式存進行儲的,所以存儲引擎也可以稱為表類型(即存儲和操作此表的類型)。
- Oracle , SqlServer等數據庫只有一種存儲引擎 , 而MySQL針對不同的需求, 配置MySQL的不同的存儲引擎 , 就會讓數據庫采取了不同的處理數據的方式和擴展功能。
- 通過選擇不同的引擎 ,能夠獲取最佳的方案 , 也能夠獲得額外的速度或者功能,提高程序的整體效果。所以了解引擎的特性 , 才能貼合我們的需求 , 更好的發揮數據庫的性能。
-
MySQL支持的存儲引擎
- MySQL5.7支持的引擎包括:InnoDB、MyISAM、MEMORY、Archive、Federate、CSV、BLACKHOLE等
- 其中較為常用的有三種:InnoDB、MyISAM、MEMORY
11.3 常用引擎的特性對比
- 常用的存儲引擎
- MyISAM存儲引擎
- 訪問快,不支持事務和外鍵。表結構保存在.frm文件中,表數據保存在.MYD文件中,索引保存在.MYI文件中。
- InnoDB存儲引擎(MySQL5.5版本后默認的存儲引擎)
- 支持事務 ,占用磁盤空間大 ,支持并發控制。表結構保存在.frm文件中,如果是共享表空間,數據和索引保存在 innodb_data_home_dir 和 innodb_data_file_path定義的表空間中,可以是多個文件。如果是多表空間存儲,每個表的數據和索引單獨保存在 .ibd 中。
- MEMORY存儲引擎
- 內存存儲 , 速度快 ,不安全 ,適合小量快速訪問的數據。表結構保存在.frm中。
- MyISAM存儲引擎
- 特性對比
特性 | MyISAM | InnoDB | MEMORY |
---|---|---|---|
存儲限制 | 有(平臺對文件系統大小的限制) | 64TB | 有(平臺的內存限制) |
事務安全 | 不支持 | 支持 | 不支持 |
鎖機制 | 表鎖 | 表鎖/行鎖 | 表鎖 |
B+Tree索引 | 支持 | 支持 | 支持 |
哈希索引 | 不支持 | 不支持 | 支持 |
全文索引 | 支持 | 支持 | 不支持 |
集群索引 | 不支持 | 支持 | 不支持 |
數據索引 | 不支持 | 支持 | 支持 |
數據緩存 | 不支持 | 支持 | N/A |
索引緩存 | 支持 | 支持 | N/A |
數據可壓縮 | 支持 | 不支持 | 不支持 |
空間使用 | 低 | 高 | N/A |
內存使用 | 低 | 高 | 中等 |
批量插入速度 | 高 | 低 | 高 |
外鍵 | 不支持 | 支持 | 不支持 |
11.4 引擎的操作
- 查詢數據庫支持的引擎
-- 標準語法
SHOW ENGINES;
-- 查詢數據庫支持的存儲引擎
SHOW ENGINES;
-- 表含義:
- support : 指服務器是否支持該存儲引擎
- transactions : 指存儲引擎是否支持事務
- XA : 指存儲引擎是否支持分布式事務處理
- Savepoints : 指存儲引擎是否支持保存點
- 查詢某個數據庫中所有數據表的引擎
-- 標準語法
SHOW TABLE STATUS FROM 數據庫名稱;
-- 查看db9數據庫所有表的存儲引擎
SHOW TABLE STATUS FROM db9;
- 查詢某個數據庫中某個數據表的引擎
-- 標準語法
SHOW TABLE STATUS FROM 數據庫名稱 WHERE NAME = '數據表名稱';
-- 查看db9數據庫中stu_score表的存儲引擎
SHOW TABLE STATUS FROM db9 WHERE NAME = 'stu_score';
- 創建數據表,指定存儲引擎
-- 標準語法
CREATE TABLE 表名(
列名,數據類型,
...
)ENGINE = 引擎名稱;
-- 創建db11數據庫
CREATE DATABASE db11;
-- 使用db11數據庫
USE db11;
-- 創建engine_test表,指定存儲引擎為MyISAM
CREATE TABLE engine_test(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10)
)ENGINE = MYISAM;
-- 查詢engine_test表的引擎
SHOW TABLE STATUS FROM db11 WHERE NAME = 'engine_test';
- 修改表的存儲引擎
-- 標準語法
ALTER TABLE 表名 ENGINE = 引擎名稱;
-- 修改engine_test表的引擎為InnoDB
ALTER TABLE engine_test ENGINE = INNODB;
-- 查詢engine_test表的引擎
SHOW TABLE STATUS FROM db11 WHERE NAME = 'engine_test';
11.5 總結:引擎的選擇
- MyISAM :由于MyISAM不支持事務、不支持外鍵、支持全文檢索和表級鎖定,讀寫相互阻塞,讀取速度快,節約資源,所以如果應用是以查詢操作和插入操作為主,只有很少的更新和刪除操作,并且對事務的完整性、并發性要求不是很高,那么選擇這個存儲引擎是非常合適的。
- InnoDB : 是MySQL的默認存儲引擎, 由于InnoDB支持事務、支持外鍵、行級鎖定 ,支持所有輔助索引(5.5.5后不支持全文檢索),高緩存,所以用于對事務的完整性有比較高的要求,在并發條件下要求數據的一致性,讀寫頻繁的操作,那么InnoDB存儲引擎是比較合適的選擇,比如BBS、計費系統、充值轉賬等
- MEMORY:將所有數據保存在RAM中,在需要快速定位記錄和其他類似數據環境下,可以提供更快的訪問。MEMORY的缺陷就是對表的大小有限制,太大的表無法緩存在內存中,其次是要確保表的數據可以恢復,數據庫異常終止后表中的數據是可以恢復的。MEMORY表通常用于更新不太頻繁的小表,用以快速得到訪問結果。
- 總結:針對不同的需求場景,來選擇最適合的存儲引擎即可!如果不確定、則使用數據庫默認的存儲引擎!