重學MySQL系列(五):談談對MySQL的存儲引擎的理解

原創做者,公衆號【程序員讀書】,歡迎關注公衆號,轉載文章請註明出處哦。mysql

MySQL關於存儲引擎的架構設計,相較於其餘關係數據庫管理系統,好比Oracle,SQL Server等數據庫,這是MySQL最大的特點,也是MySQL最不同的地方,所以,在這篇文章中咱們來簡單地瞭解一下。程序員

存儲引擎架構

MySQL的存儲引擎架構被設計爲可插拔式架構模式,也就是在不影響任何業務邏輯的狀況下,咱們能夠隨時替換當前的存儲引擎,以達到以存儲和性能方面的需求。sql

其實,咱們能夠經過下面MySQL服務架構圖來了解一下這個過程:數據庫

從上面的圖咱們能夠看到,MySQLServer層與存儲引擎層經過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:說明該存儲引擎是否支持部分事務回滾。

存儲引擎介紹

在上面列出的存儲引擎中,咱們最經常使用即是InnoDBMyISAM這個存儲引擎了,因此咱們重點來介紹一下這兩個存儲引擎,並進行比較學習。

InnoDB

InnoDB存儲引擎是MySQL的默認存儲引擎,支持行級鎖定、MVCC多版本控制、非鎖定讀、事務、外健等特性,對事務的支持,讓MySQL成爲更加完善的數據庫管理系統系統,行級鎖定使InnoDB能夠支持更大的併發數。

通常來講,若是沒有什麼其餘特殊的需求,InnoDB存儲引擎是使用MySQL建立數據表的首選。

MyISAM

MySQL5.1之前,MyISAM存儲引擎是MySQL是默認存儲引擎,MyISAM支持表級鎖定,並不支持事務,比較適合大量的select和insert操做。

InnoDB與MyISAM存儲引擎之間的比較

下面咱們如下幾個方面來比較一下這兩個存儲引擎的不一樣。

事務的支持

InnoDB支持ACID的事務處理,MyISAM並不支持事務,這裏須要注意,若是咱們在程序須要進行事務處理,全部的數據都要使用Innodb存儲引擎,若是中間有MyISAM存儲引擎的數據表,若是進行事務回滾,MyISAM並不會回滾到以前的狀態,所以MyISAM不支持事務。

索引與主鍵處理

InnoDB存儲引擎使用的是彙集索引,InnoDB主鍵的葉子節點是該行的數據,而其餘索引則指向主鍵,而MyISAM存儲引擎使用的是非彙集索引,主鍵與其餘索引的葉子節點都存儲了指向數據的指針。

另一個是MyISAM數據表容許沒有主鍵和其餘索引,而InnoDB數據表若是沒有主鍵的話,而會生成一個用戶不可見6字節的主鍵。

外鍵

MyISAM不支持外鍵,而Innodb則支持創建數據表之間的外鍵關聯。

存儲文件的不一樣

Innodb存儲文件有frmibd,而MyISAMfrmMYDMYI,Innodb存儲文件中frm是數據表結構定義文件,ibd是數據文件,MyISAM中frm是數據表結構定義文件,MYD是數據的文件,MYI則是存儲索引的文件。

select count(*)

使用MyISAM存儲引擎的數據表會記錄一個數據表的總行數,因此對使用MyISAM存儲引擎的數據表進行select count(*),能夠很快獲得一個數據表的總行數,而對於InnoDB存儲引擎的數據表,想要查詢總行數須要進行全表掃描才能獲得。

鎖的級別

InnoDB支持行級鎖,而MyISAM只支持表級鎖,所以InnoDB更能支持高併發。

設置默認存儲引擎

上面咱們說過,InnoDBMySQL的默認存儲引擎,固然咱們也能夠設置其餘存儲引擎爲默認存儲引擎,有兩種方式進行設置,如:

服務器啓動時設置

在服務器啓動時,使用--default-storage-engine命令能夠設置默認存儲引擎:

mysqld --default-storage-engine=MyISAM
複製代碼

上面指定的是正常數據表的存儲引擎,臨時表的默認存儲也可使用--default-tmp-storage-engine參數來設置:

mysqld --default-tmp-storage-engine=MyISAM
複製代碼

經過set命令設置

除了在啓動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的可插拔式存儲引擎設計,使用咱們的能夠根據本身的業務需求,選擇適合本身的存儲引擎。


若是你以爲文章不錯,歡迎掃碼關注,你的關注就是我寫做的最大動力

相關文章
相關標籤/搜索