InnoDB 存儲引擎詳解
接下來重點介紹四種常見的存儲引擎:InnoDB、MyISAM、Memory、TokuDB。這部分內(nèi)容分為上下兩個小節(jié),本小節(jié)重點介紹常用存儲引擎的對比,以及 InnoDB 存儲引擎。
1. 常用存儲引擎的對比
2. InnoDB 存儲引擎
從 5.5 版本開始,InnoDB 是MySQL的默認事務性引擎,也是最重要、使用最廣泛的存儲引擎。InnoDB 具有提交、回滾、自動崩潰恢復的事務安全保障,擁有獨立的緩存和日志,提供行級別的鎖粒度和強大的并發(fā)能力。
在大多數(shù)使用場景中,包括事務型和非事務型存儲需求,InnoDB 都是更好的選擇,除非有非常特別的原因需要使用其他存儲引擎。
下面將介紹 InnoDB 區(qū)別于其他存儲引擎的特點。
2.1 自動增長列
InnoDB 表的自動增長列,插入的值可以為空,也可以人工插入,如果插入的值為空,則實際插入的值是自動增長后的值。
下面定義表 t1,字段 c1 為自動增長列,對該表進行 insert 操作,可以發(fā)現(xiàn),當插入值為空時,實際插入的值是自動增長后的值。
mysql> create table t1(
-> c1 int not null auto_increment,
-> c2 varchar(10) default null,
-> primary key(c1)
-> ) engine = innodb;
Query OK, 0 rows affected (0.05 sec)
mysql> insert into t1(c1,c2) values(null,'1'),(2,'2');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
| 2 | 2 |
+----+------+
2 rows in set (0.00 sec)
InnoDB中,自增長列必須是索引,同時必須是索引的第一個列 。如果不是第一個列,數(shù)據(jù)庫會報出異常
mysql> create table t2(
-> c1 int not null auto_increment,
-> c2 varchar(10) default null,
-> key(c2,c1)
-> ) engine = innodb;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
mysql> create table t2(
-> c1 int not null auto_increment,
-> c2 varchar(10) default null,
-> key(c1,c2)
-> ) engine = innodb;
Query OK, 0 rows affected (0.05 sec)
2.2 主鍵和索引
InnoDB 表是基于聚簇索引建立的,聚簇索引也叫主索引,也是表的主鍵,InnoDB 表的每行數(shù)據(jù)都保存在主索引的葉子節(jié)點上。InnoDB 表必須包含主鍵,如果創(chuàng)建表時,沒有顯式指定主鍵,InnoDB 會自動創(chuàng)建一個長度為 6 個字節(jié)的 long 類型隱藏字段作為主鍵。所有的 InnoDB 表都應該顯式指定主鍵。
InnoDB 表中,除主鍵之外的索引,叫做二級索引。二級索引必須包含主鍵列,如果主鍵列很大的話,其他的所有索引都會很大。因此,主鍵是否設計合理,對所有的索引都會產(chǎn)生影響。
一般來說,主鍵的設計原則大致如下:
- 滿足唯一和非空約束;
- 主鍵字段應盡可能地小;
- 主鍵字段值基本不會被修改;
- 優(yōu)先考慮自增字段,或查詢最頻繁的字段。
2.3 存儲方式
InnoDB 存儲表和索引的方式,有以下兩種:
- 獨享表空間的存儲方式:表結構保存在 .frm 文件中,每個表的數(shù)據(jù)和索引單獨保存在 .ibd 文件中;
- 共享表空間的存儲方式:表結構保存在 .frm 文件中,數(shù)據(jù)和索引保存在表空間 ibdata 文件中。
使用共享表空間時,隨著數(shù)據(jù)的不斷增長,表空間的維護會越來越困難,一般情況,都建議使用獨享表空間??梢酝ㄟ^配置參數(shù) innodb_file_per_table 來開啟獨享表空間。
innodb_file_per_table = 1 #1為開啟獨享表空間
使用獨享表空間時,可以很方便對單表進行備份和恢復操作,但是直接復制 .ibd 文件是不行的,因為缺少共享表空間的數(shù)據(jù)字典信息,但是可以通過下面的命令,實現(xiàn) .ibd 文件和 .frm 文件能被正確識別和恢復。
alter table xxx discard tablespace;
alter table xxx import tablespace;
3. 小結
本小節(jié)介紹了常用存儲引擎的對比,以及 InnoDB 存儲引擎區(qū)別于其他存儲引擎的特點:自動增長列、主鍵和索引、存儲方式。