1. 程式人生 > MYSQL進階教學 ><p>InnoDB 儲存引擎詳解</p>

<p>InnoDB 儲存引擎詳解</p>

接下來重點介紹四種常見的儲存引擎:InnoDB、MyISAM、Memory、TokuDB。這部分內容分為上下兩個小節,本小節重點介紹常用儲存引擎的對比,以及 InnoDB 儲存引擎。

1. 常用儲存引擎的對比

圖片描述

四種常用儲存引擎在功能方面的對比

2. InnoDB 儲存引擎

從 5.5 版本開始,InnoDB 是MySQL的預設事務性引擎,也是最重要、使用最廣泛的儲存引擎。InnoDB 具有提交、回滾、自動崩潰恢復的事務安全保障,擁有獨立的快取和日誌,提供行級別的鎖粒度和強大的併發能力。

在大多數使用場景中,包括事務型和非事務型儲存需求,InnoDB 都是更好的選擇,除非有非常特別的原因需要使用其他儲存引擎。

下面將介紹 InnoDB 區別於其他儲存引擎的特點。

2.1 自動增長列

InnoDB 表的自動增長列,插入的值可以為空,也可以人工插入,如果插入的值為空,則實際插入的值是自動增長後的值。

下面定義表 t1,欄位 c1 為自動增長列,對該表進行 insert 操作,可以發現,當插入值為空時,實際插入的值是自動增長後的值。

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中,自增長列必須是索引,同時必須是索引的第一個列 。如果不是第一個列,資料庫會報出異常

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 表的每行資料都儲存在主索引的葉子節點上。InnoDB 表必須包含主鍵,如果建立表時,沒有顯式指定主鍵,InnoDB 會自動建立一個長度為 6 個位元組的 long 型別隱藏欄位作為主鍵。所有的 InnoDB 表都應該顯式指定主鍵。

InnoDB 表中,除主鍵之外的索引,叫做二級索引。二級索引必須包含主鍵列,如果主鍵列很大的話,其他的所有索引都會很大。因此,主鍵是否設計合理,對所有的索引都會產生影響。

一般來說,主鍵的設計原則大致如下:

  • 滿足唯一和非空約束;
  • 主鍵欄位應儘可能地小;
  • 主鍵欄位值基本不會被修改;
  • 優先考慮自增欄位,或查詢最頻繁的欄位。

2.3 儲存方式

InnoDB 儲存表和索引的方式,有以下兩種:

  • 獨享表空間的儲存方式:表結構儲存在 .frm 檔案中,每個表的資料和索引單獨儲存在 .ibd 檔案中;
  • 共享表空間的儲存方式:表結構儲存在 .frm 檔案中,資料和索引儲存在表空間 ibdata 檔案中。

使用共享表空間時,隨著資料的不斷增長,表空間的維護會越來越困難,一般情況,都建議使用獨享表空間。可以通過配置引數 innodb_file_per_table 來開啟獨享表空間。

innodb_file_per_table = 1 #1為開啟獨享表空間

使用獨享表空間時,可以很方便對單表進行備份和恢復操作,但是直接複製 .ibd 檔案是不行的,因為缺少共享表空間的資料字典資訊,但是可以通過下面的命令,實現 .ibd 檔案和 .frm 檔案能被正確識別和恢復。

alter table xxx discard tablespace;
alter table xxx import tablespace;

3. 小結

本小節介紹了常用儲存引擎的對比,以及 InnoDB 儲存引擎區別於其他儲存引擎的特點:自動增長列、主鍵和索引、儲存方式。