原創做者,公衆號【程序員讀書】,歡迎關注公衆號,轉載文章請註明出處哦。mysql
MySQL
關於存儲引擎的架構設計,相較於其餘關係數據庫管理系統,好比Oracle
,SQL Server
等數據庫,這是MySQL
最大的特點,也是MySQL
最不同的地方,所以,在這篇文章中咱們來簡單地瞭解一下。程序員
MySQL
的存儲引擎架構被設計爲可插拔式架構模式,也就是在不影響任何業務邏輯的狀況下,咱們能夠隨時替換當前的存儲引擎,以達到以存儲和性能方面的需求。sql
其實,咱們能夠經過下面MySQL服務架構圖來了解一下這個過程:數據庫
從上面的圖咱們能夠看到,MySQL
的Server
層與存儲引擎層經過MySQL
服務器提供統一的API
接口與存儲引擎進行交互,Server
不關心底層存儲引擎的實現細節,而不一樣的存儲引擎對數據的存儲與處理、查詢都有本身的實現。bash
MySQL
支持多種存儲引擎,若是咱們想查看本身的MySQL
服務器支持多少種存儲引擎,可使用SHOW ENGINES
命令進行查詢,如:服務器
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 |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
複製代碼
上面是個人服務器所支持的存儲引擎,固然不一樣的MySQL
版本支持的存儲引擎是不同的,上面顯示的表格中,每一個字段的含義:併發
Engine
:存儲引擎名稱。app
Support
:是否支持該引擎以及該引擎是否爲默認存儲引擎,YES
表示支持,NO
表示不支持,DEFAULT
表示爲默認存儲引擎。ide
Comment
:存儲引擎的簡單介紹。
Transactions
:表示該引擎是否支持事務。
XA
:說明該存儲引擎是否支持分佈事務。
Savepoints
:說明該存儲引擎是否支持部分事務回滾。
在上面列出的存儲引擎中,咱們最經常使用即是InnoDB
與MyISAM
這個存儲引擎了,因此咱們重點來介紹一下這兩個存儲引擎,並進行比較學習。
InnoDB
存儲引擎是MySQL
的默認存儲引擎,支持行級鎖定、MVCC多版本控制、非鎖定讀、事務、外健等特性,對事務的支持,讓MySQL
成爲更加完善的數據庫管理系統系統,行級鎖定使InnoDB能夠支持更大的併發數。
通常來講,若是沒有什麼其餘特殊的需求,InnoDB存儲引擎是使用MySQL建立數據表的首選。
在MySQL5.1
之前,MyISAM
存儲引擎是MySQL
是默認存儲引擎,MyISAM支持表級鎖定,並不支持事務,比較適合大量的select和insert操做。
下面咱們如下幾個方面來比較一下這兩個存儲引擎的不一樣。
InnoDB支持ACID的事務處理,MyISAM並不支持事務,這裏須要注意,若是咱們在程序須要進行事務處理,全部的數據都要使用Innodb存儲引擎,若是中間有MyISAM存儲引擎的數據表,若是進行事務回滾,MyISAM並不會回滾到以前的狀態,所以MyISAM不支持事務。
InnoDB
存儲引擎使用的是彙集索引,InnoDB
主鍵的葉子節點是該行的數據,而其餘索引則指向主鍵,而MyISAM
存儲引擎使用的是非彙集索引,主鍵與其餘索引的葉子節點都存儲了指向數據的指針。
另一個是MyISAM
數據表容許沒有主鍵和其餘索引,而InnoDB
數據表若是沒有主鍵的話,而會生成一個用戶不可見6字節的主鍵。
MyISAM
不支持外鍵,而Innodb
則支持創建數據表之間的外鍵關聯。
Innodb
存儲文件有frm
、ibd
,而MyISAM
是frm
、MYD
、MYI
,Innodb
存儲文件中frm
是數據表結構定義文件,ibd
是數據文件,MyISAM中frm
是數據表結構定義文件,MYD
是數據的文件,MYI
則是存儲索引的文件。
使用MyISAM
存儲引擎的數據表會記錄一個數據表的總行數,因此對使用MyISAM
存儲引擎的數據表進行select count(*)
,能夠很快獲得一個數據表的總行數,而對於InnoDB
存儲引擎的數據表,想要查詢總行數須要進行全表掃描才能獲得。
InnoDB
支持行級鎖,而MyISAM
只支持表級鎖,所以InnoDB
更能支持高併發。
上面咱們說過,InnoDB
是MySQL
的默認存儲引擎,固然咱們也能夠設置其餘存儲引擎爲默認存儲引擎,有兩種方式進行設置,如:
在服務器啓動時,使用--default-storage-engine
命令能夠設置默認存儲引擎:
mysqld --default-storage-engine=MyISAM
複製代碼
上面指定的是正常數據表的存儲引擎,臨時表的默認存儲也可使用--default-tmp-storage-engine
參數來設置:
mysqld --default-tmp-storage-engine=MyISAM
複製代碼
除了在啓動MySQL服務器時設置外,在進行登陸到服務器中後,也可經過SET
命令來設置默認存儲引擎:
指定普通數據表的默認存儲引擎:
SET default_storage_engine=MyISAM;
複製代碼
指定臨時數據表默認存儲引擎:
SET default_tmp_storage_engine=MyISAM
複製代碼
爲數據表指定存儲引擎有兩種狀況,一種是在使用CREATE TABLE
語句建立數據表的時,另一種則是對於已經建立好的數據表。
當咱們在建立數據表的時候,若是沒有指定存儲引擎,則會使用上面設置的默認存儲引擎,好比咱們下面的建表語句:
CREATE TABLE users(
id INT NOT NULL,
name VARCHAR(20) NOT NULL,
gender TINYINT NOT NULL,
email VARCARH(50) NOT NULL,
PRIMARY KEY(id)
);
複製代碼
若是咱們在建立數據表時,不想用默認的存儲引擎,則能夠在CREATE TABLE
語句後指定ENGINE
參數來設置存儲引擎,如:
CREATE TABLE users(
id INT NOT NULL,
name VARCHAR(20) NOT NULL,
gender TINYINT NOT NULL,
email VARCARH(50) NOT NULL,
PRIMARY KEY(id)
)ENGINE=MyISAM;
複製代碼
對於已經建立好的數據表,則可使用ALTER TABLE語句
來修改存儲引擎,好比咱們將上面的users
數據表從新改成Innodb
存儲引擎,能夠這樣作:
mysql> ALTER TABLE users engine=InnoDB;
複製代碼
在MySQL
中,對數據的存儲,查詢、處理、修改都因爲存儲引擎來執行,MySQL
的可插拔式存儲引擎設計,使用咱們的能夠根據本身的業務需求,選擇適合本身的存儲引擎。
若是你以爲文章不錯,歡迎掃碼關注,你的關注就是我寫做的最大動力