1. 程式人生 > 資料庫 >MySQL儲存引擎基礎知識

MySQL儲存引擎基礎知識

在之前的文章中我們說過MySQL事務,現在大家都應該知道了MySQL事務了吧,還記得事務的ACID原則嗎?不記得的童鞋可以回顧一下《MySQL之事務初識》,其實呀,更嚴謹一點的話,應該是MySQL InnoDB儲存引擎,因為在MySQL中,只有InnoDB儲存引擎才支援事務。看到此處,有些朋友可能有以下疑問:

儲存引擎是什麼?

MySQL中有哪些儲存引擎?

每個儲存引擎有哪些特點以及區別?

下面,我們帶著這些疑問,依次往下看:

儲存引擎是什麼?

通俗一點來說,MySQL是用來儲存資料的對不對?我們可以把儲存引擎看作是一種儲存檔案的方式以及該方式附屬的一整套工具,其中每個儲存檔案方式的特點就是該儲存引擎的特點。

例如:Memory儲存引擎將資料儲存至記憶體中,其優點是:讀寫快,但是資料不是持久到磁碟中的,非常容易丟失等等。

MySQL中的儲存引擎

在MySQL 5.7版本中,MySQL支援的儲存引擎有:

InnoDB

MyISAM

Memory

CSV

Archive

Blackhole

Merge:

Federated

Example

下面只介紹常用的儲存引擎,其他沒介紹的儲存引擎,有興趣的童鞋,可以自己自行搜尋。

InnoDB:支援事務操作(如 begin, commit,rollback命令),支援行級鎖,行級鎖相對於表鎖,其粒度更細,允許併發量更大,這裡面細節還挺多的,下次,我們單獨寫一篇)支援外來鍵引用完整性約束。InnoDB儲存引擎也是MySQL 5.7版本中預設的儲存引擎。其缺點是:儲存空間會佔用比較大。

MyISAM:該儲存引擎儲存佔用的空間相對與InnoDB儲存引擎來說會少很多,但其支援的為表鎖,其併發效能會低很多,而且不支援事務,通常只應用於只讀模式的應用。它是MySQL最原始的儲存引擎。

Memory:該儲存引擎最大的特點是,所有資料均儲存在記憶體中,之前還有個名字叫做 「Heap」。
應用場景: 主要儲存一些需要快速訪且非關鍵資料,為什麼不是關鍵資料呢?就因為其所有資料儲存在記憶體中,也可以理解為不安全。

CSV:首先先認識一下CSV,CSV檔案其實就是用逗號分隔開的文字檔案,常用於資料轉換,該型別平時用的比較少,不支援索引。

Archive:存檔檔案,主要用於儲存很少用到的引用檔案,

Example:該儲存引擎主要用於展示如何自行編寫一個儲存引擎,一般不會用作生產環境使用。

如何選擇儲存引擎

大家通過上面的比較應該已經看出來了,InnoDB儲存引擎是支援事務,支援外來鍵並支援行級鎖的。對於需要線上事務處理的應用最合適不過了,我們在選擇儲存引擎時,如果沒有特別的理由,我的建議是選擇InnoDB作為儲存引擎。

1、我們可以在建立table時,指定儲存引擎,如果未指定,則使用預設的儲存引擎。

create table t_base_user(
oid bigint(20) not null primary key auto_increment comment "",created_at datetime null comment ''
)engine=innodb

2、(方法一) 顯示該表的儲存引擎

mysql> show table status like "t_base_user" \G;
*************************** 1. row ***************************
    Name: t_base_user
   Engine: InnoDB
   Version: 10
 Row_format: Dynamic
    Rows: 0
Avg_row_length: 0
 Data_length: 16384
Max_data_length: 0
Index_length: 0
  Data_free: 0
Auto_increment: 1
 Create_time: 2017-12-17 20:10:24
 Update_time: NULL
 Check_time: NULL
  Collation: utf8_unicode_ci
  Checksum: NULL
Create_options: 
   Comment: 
1 row in set (0.01 sec)

3、(方法二) 顯示錶的儲存引擎資訊

mysql> show create table t_base_user\G;
*************************** 1. row ***************************
  Table: t_base_user
Create Table: CREATE TABLE `t_base_user` (
`oid` bigint(20) NOT NULL AUTO_INCREMENT,`created_at` datetime DEFAULT NULL,PRIMARY KEY (`oid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
1 row in set (0.00 sec)

另外需要注意的是: 不建議修改表的儲存引擎,在建立表時,就要需要考慮好,使用什麼儲存引擎。

今日命令

命令: show engines;

標準語法:show stroage engines;

其中stroage為可選項。

作用:顯示當前MySQL版本支援的儲存引擎。

例子(MySQL版本: 5.7.20):

mysql> show storage engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine       | Support | Comment                            | Transactions | XA  | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MRG_MYISAM     | YES   | Collection of identical MyISAM tables             | NO      | NO  | NO     |
| CSV        | YES   | CSV storage engine                       | NO      | NO  | NO     |
| MyISAM       | YES   | MyISAM storage engine                     | NO      | NO  | NO     |
| BLACKHOLE     | YES   | /dev/null storage engine (anything you write to it disappears) | NO      | NO  | NO     |
| MEMORY       | YES   | Hash based,stored in memory,useful for temporary tables   | NO      | NO  | NO     |
| InnoDB       | DEFAULT | Supports transactions,row-level locking,and foreign keys   | YES     | YES | YES    |
| 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)

使用場景:在檢視當前資料庫版本支援的儲存引擎,檢視預設儲存引擎時非常實用。

Engine:儲存引擎名稱。

Support: 表示MySQL當前伺服器版本是否支援該儲存引擎,YES為支援 NO 為不支援。

Comment:為該儲存引擎的特性,如Innodb

支援事務,行級鎖等。

Transactions:是否支援事務,YES為支援,No為不支援。

XA和Savepoints:這兩個屬性,與事務相關,當Transactions為Yes時,這兩個屬性才有意義,否則均為NO。