談談MySQL存儲引擎

本文首發於個人微信公眾號《andyqian》,期待你的關注!

前言

大家周末過的還愉快嗎?一眨眼周末就過去了,明天得上班寫BUG了。What?寫BUG?沒錯,就是寫BUG,為此測試」房姐」調侃了我不少,就差沒叫我「BUG」了,還在上周告訴了我一個永無BUG的方法。聽到答案的我」面紅耳赤」的繼續寫BUG。答案是什麼?你們先猜猜看?

引子

在之前的文章中我們說過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

  1. (方法一) 顯示該表的存儲引擎

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)

  1. (方法二) 顯示錶的存儲引擎信息

mysql> show create table t_base_userG;

*************************** 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)

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

今日命令

命令show engines; 標準語法show stroage engines;

其中stroage為可選項。

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

例子(MySQL版本: 5.7.20):

mysql> show storage engines;n+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+n| Engine | Support | Comment | Transactions | XA | Savepoints |n+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+n| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |n| CSV | YES | CSV storage engine | NO | NO | NO |n| MyISAM | YES | MyISAM storage engine | NO | NO | NO |n| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |n| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |n| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |n| ARCHIVE | YES | Archive storage engine | NO | NO | NO |n| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |n| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |n+--------------------+---------+---------------------------------------------------------------+--------------+------+------------+n9 rows in set (0.00 sec)n

使用場景:在查看當前資料庫版本支持的存儲引擎,查看默認存儲引擎時非常實用。

Engine:存儲引擎名稱。

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

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

支持事務,行級鎖等。

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

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

相關閱讀:

寫會MySQL索引

十個實用MySQL命令

說說 MySQL JSON 數據類型

淺談MySQL Online DDL(下)

最後:「房姐」 說的永無BUG的方法是:「不寫代碼」。

推薦閱讀:

資料庫主從複製,讀寫分離,負載均衡,分庫分表分別表達的什麼概念?
國家能不能建立一個新生兒DNA比對資料庫來預防小孩被拐賣?
《Designing Data-Intensive Application》讀書筆記 Part1

TAG:MySQL入门 | MySQL | 数据库设计 |