【mysql】mysql存儲引擎

瞭解存儲引擎咱們先看下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

 特性:

  • 表損壞修復:能夠對因爲意外關閉致使採用MyISAM的表進行修復操做。可使用mysql提供的check,repair語句檢查修復表。
  • 支持全文索引類型。
  • 不支持事務。
  • 存儲格式:靜態表,動態表,壓縮表(當一張大表導入數據後不在進行修改操做了,這樣能夠壓縮表,減小空間)。
  • mysql版本小於5.0時,默認表大小4G,若是想存儲大點表要修改MAX_Rows和AVG_ROW_LENGTH這兩個參數。修改後表會重建,須要點時間。在高版本的mysql這個默認支持單表大小256TB。
  • 僅在內存中保存索引。

適用場景:

  • 非事務型應用。
  • 只讀類的應用。     
  • 空間類的應用(支持空間類的函數),好比地理數據。

 示例:

建立一個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存儲引擎特性:

  1. 支持事務。徹底支持事務的ACID特性。innodb使用undo log 日誌(存儲未提交的事務來幫助未提交事務回滾和實現MVCC多版本併發控制,這個文件能夠獨立表空間存在)和redo log日誌(存儲已經提交的事務,內容是順序寫入)來實現。
  2. 支持行級鎖。在寫操做時候鎖定的資源更少,行級鎖能夠最大程度的支持併發。行級鎖是由存儲引擎本身實現的,mysql服務器不知道存儲引擎鎖的實現方式。
  3. 在內存中保存索引和數據。

 查看默認存儲引擎:

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

 

 

系統表空間和獨立表空間要如何選擇。

咱們能夠對比下分析:

  1. 當刪除數據表中不用的數據的時候,系統表空間沒法簡單的縮小文件的大小。
  2. 獨立表空間能夠經過optimize table命令來收縮系統文件,減小磁盤碎片。不須要重啓數據庫,不影響表的正常訪問。
  3. 系統表空間因爲只有一個文件,會產生IO瓶頸,若是對多個表數據刷新時候,從文件系統層面來看,是順序進行的。而獨立表空間,每張表都有本身的表空間文件,在添加數據的時候,能夠利用多個文件增長IO處理的性能,因此對於頻繁數據寫入操做的系統不太適合獨立表空間。
相關文章
相關標籤/搜索