瞭解存儲引擎咱們先看下mysql的體系架構。php
上圖是mysql的邏輯架構圖,能夠看到分了幾層。node
第一層是大部分網路客戶端工具,好比php,python ,JDBC等,主要功能就是鏈接處理,受權認證等,這層並非mysql獨有的。每一個鏈接到mysql的客戶端都會在服務端有個線程,這個鏈接的查詢只會在這個線程中執行查詢。 python
第二層是mysql服務層,包括了鏈接管理器,查詢解析器,查詢緩存,查詢優化器,以及全部的mysql內置函數和sql接口。經常使用的DDL,DML語句都是在這層定義的,這層實現了全部跨存儲引擎的功能:存儲過程,存儲函數,觸發器,視圖等等, 包含和存儲引擎無關的特性(好比說常見的select語句,從文件系統中獲取咱們想要的數據這個具體的功能是由存儲引擎實現),是mysql的核心服務功能所在的地方。 mysql
第三層,也就是文件系統層上面那一排就是mysql的存儲引擎,者層被稱之爲存儲引擎層,這也是mysql最有特色的就是它的插件式存儲引擎,這種設計將數據庫查詢處理及數據的存儲提取相分離,由於mysql中的數據存儲和提取是由存儲引擎來負責的,者層服務器經過API接口和存儲引擎通訊,而這些接口屏蔽了不一樣存儲引擎的差別(好比很是出名的innodb存儲引擎就是由第三方公司開發的),因此這種設計方式可讓咱們在使用數據庫的時候能夠靈活的根據不一樣存儲引擎的性能和特徵來選擇。web
注意:sql
存儲引擎是針對表的,一個數據庫裏不一樣的表能夠選擇不一樣的存儲引擎。數據庫
MySQL經常使用的存儲引擎的介紹緩存
mysql存儲引擎層多種存儲引擎,它們各自的特性各不相同,包括InnoDB、MyISAM、Memory等。如今最經常使用的存儲引擎是InnoDB,它從MySQL 5.5.5版本開始成爲了mysql的默認存儲引擎。服務器
查看當前mysql存儲引擎信息架構
mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
1.MyISAM存儲引擎
MyISAM是mysql5.5以前的默認存儲引擎,它是mysql最先使用的存儲引擎之一,它也是大部分系統表,臨時表(不是create table語句建的,這裏是指在排序,分組等操做中,當記錄數量超過必定大小的時候,由查詢優化器創建的臨時表)所採用的存儲引擎。MyISAM存儲引擎物理文件由MYD(數據文件)和MYI(索引文件)組成。
[root@localhost ~]# ls /usr/local/mysql/data/oa_2018/ | grep "^web_entry" web_entry.frm 這個frm後綴是用來記錄表的結構的文件 web_entry.MYD web_entry.MYI
特性:
適用場景:
示例:
建立一個mysiam引擎的表。
mysql> create table myiam_table(id int,name varchar(20)) engine=myisam; Query OK, 0 rows affected (0.34 sec)
使用語句檢查修復表。
mysql> check table myiam_table; +------------------------------+-------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------------------------+-------+----------+----------+ | oa_workflow_test.myiam_table | check | status | OK | 狀態ok 說明表是正常的 +------------------------------+-------+----------+----------+ 1 row in set (0.16 sec) mysql> repair table myiam_table; +------------------------------+--------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------------------------+--------+----------+----------+ | oa_workflow_test.myiam_table | repair | status | OK | +------------------------------+--------+----------+----------+ 1 row in set (0.12 sec)
壓縮表,可使用myisampack打包壓縮。壓縮前先查看文件狀況。
[root@localhost oa_workflow_test]# ls -l myiam_table* -rw-r----- 1 mysql mysql 3066 6月 2 00:27 myiam_table_5769.SDI -rw-r----- 1 mysql mysql 0 6月 2 00:27 myiam_table.MYD -rw-r----- 1 mysql mysql 1024 6月 2 00:27 myiam_table.MYI
開始壓縮
[root@localhost oa_workflow_test]# myisampack -b -f myiam_table.MYI f參數是強制壓縮 Compressing myiam_table.MYD: (1 records) - Calculating statistics - Compressing file -150%
壓縮後咱們在看下目錄多了一個文件myiam_table.OLD,這個壓縮以前myiam_table.MYI一個文件備份。
[root@localhost oa_workflow_test]# ls -l myiam_table* -rw-r----- 1 mysql mysql 3066 6月 2 00:27 myiam_table_5769.SDI -rw-r----- 1 mysql mysql 57 6月 2 00:59 myiam_table.MYD -rw-r----- 1 mysql mysql 1024 6月 2 01:04 myiam_table.MYI -rw-r----- 1 mysql mysql 40 6月 2 01:04 myiam_table.OLD
2.innodb存儲引擎
innodb存儲引擎是mysql5.5以後的默認存儲引擎。是一種事務型存儲引擎,支持事務的ACID特性,innodb的設計能夠適合處理大量的小事務,小事務大部分狀況下會被提交,不多被回滾。innodb在存儲方面跟mysiam不同,它有存儲表空間的概念,數據是存儲在表空間中的,具體怎麼存儲是由innodb_file_per_table這個參數定義的,參數爲on則會爲每一個nnodb表創建idb爲後綴的系統文件,好比tablename.idb,參數爲off則把數據放在系統的表空間ibdataX(X表示數字)。
innodb存儲引擎特性:
查看默認存儲引擎:
mysql> show variables like 'default_storage_engine'; +------------------------+--------+ | Variable_name | Value | +------------------------+--------+ | default_storage_engine | InnoDB | +------------------------+--------+
查看innodb_file_per_table的設置。
mysql> show variables like 'innodb_file_per_table'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+
mysql> create table table_innode(id int,name varchar(10)) engine ='innodb'; Query OK, 0 rows affected (0.70 sec)
而後看下在文件系統中如何存儲的。
[root@localhost webim]# ll -rw-r----- 1 mysql mysql 147456 9月 15 2017 conf_project_archives.ibd -rw-r----- 1 mysql mysql 131072 6月 3 13:37 table_innode.ibd -rw-r----- 1 mysql mysql 131072 8月 24 2017 table_innode.frm mysql8.0版本已經將這個文件取消掉了
若是將innodb_file_per_table設置成off,看看innodb如何存儲。
mysql> set global innodb_file_per_table=off; Query OK, 0 rows affected (0.04 sec)
建立一張新表
mysql> create table my_innode_off(id int,name varchar(10)) engine ='innodb'; Query OK, 0 rows affected (0.10 sec)
再次查看目錄文件,發現此次只有frm文件。
[root@localhost webim]# ll 總用量 528 -rw-r----- 1 mysql mysql 147456 9月 15 2017 conf_project_archives.ibd -rw-r----- 1 mysql mysql 131072 6月 3 13:40 table_innode.ibd -rw-r----- 1 mysql mysql 131072 6月 3 13:37 table_innode.frm -rw-r----- 1 mysql mysql 131072 8月 24 2017 my_innodb_off.frm
其實數據是存儲在系統的共享表空間中,進入上一層目錄,能夠看見一個名爲ibdata1的文件
[root@localhost webim]# cd .. [root@localhost data]# ll -rw-r-----. 1 mysql mysql 56 6月 27 2017 auto.cnf drwxr-x--- 2 mysql mysql 83 11月 30 2017 db_kingnet_ganen -rw-r----- 1 mysql mysql 223 11月 22 2017 db_kingnet_ganen_10.SDI drwxr-x--- 2 mysql mysql 16384 10月 30 2017 db_kingnet_oa -rw-r----- 1 mysql mysql 1144 5月 27 21:56 ib_buffer_pool -rw-r-----. 1 mysql mysql 79691776 6月 3 13:56 ibdata1
系統表空間和獨立表空間要如何選擇。
咱們能夠對比下分析: