第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開(kāi)發(fā)者教程

MySQL 進(jìn)階教程

InnoDB 存儲(chǔ)引擎詳解

接下來(lái)重點(diǎn)介紹四種常見(jiàn)的存儲(chǔ)引擎:InnoDB、MyISAM、Memory、TokuDB。這部分內(nèi)容分為上下兩個(gè)小節(jié),本小節(jié)重點(diǎn)介紹常用存儲(chǔ)引擎的對(duì)比,以及 InnoDB 存儲(chǔ)引擎。

1. 常用存儲(chǔ)引擎的對(duì)比

圖片描述

四種常用存儲(chǔ)引擎在功能方面的對(duì)比

2. InnoDB 存儲(chǔ)引擎

從 5.5 版本開(kāi)始,InnoDB 是MySQL的默認(rèn)事務(wù)性引擎,也是最重要、使用最廣泛的存儲(chǔ)引擎。InnoDB 具有提交、回滾、自動(dòng)崩潰恢復(fù)的事務(wù)安全保障,擁有獨(dú)立的緩存和日志,提供行級(jí)別的鎖粒度和強(qiáng)大的并發(fā)能力。

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

下面將介紹 InnoDB 區(qū)別于其他存儲(chǔ)引擎的特點(diǎn)。

2.1 自動(dòng)增長(zhǎng)列

InnoDB 表的自動(dòng)增長(zhǎng)列,插入的值可以為空,也可以人工插入,如果插入的值為空,則實(shí)際插入的值是自動(dòng)增長(zhǎng)后的值。

下面定義表 t1,字段 c1 為自動(dòng)增長(zhǎng)列,對(duì)該表進(jìn)行 insert 操作,可以發(fā)現(xiàn),當(dāng)插入值為空時(shí),實(shí)際插入的值是自動(dòng)增長(zhǎng)后的值。

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中,自增長(zhǎng)列必須是索引,同時(shí)必須是索引的第一個(gè)列 。如果不是第一個(gè)列,數(shù)據(jù)庫(kù)會(huì)報(bào)出異常

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é)點(diǎn)上。InnoDB 表必須包含主鍵,如果創(chuàng)建表時(shí),沒(méi)有顯式指定主鍵,InnoDB 會(huì)自動(dòng)創(chuàng)建一個(gè)長(zhǎng)度為 6 個(gè)字節(jié)的 long 類(lèi)型隱藏字段作為主鍵。所有的 InnoDB 表都應(yīng)該顯式指定主鍵。

InnoDB 表中,除主鍵之外的索引,叫做二級(jí)索引。二級(jí)索引必須包含主鍵列,如果主鍵列很大的話,其他的所有索引都會(huì)很大。因此,主鍵是否設(shè)計(jì)合理,對(duì)所有的索引都會(huì)產(chǎn)生影響。

一般來(lái)說(shuō),主鍵的設(shè)計(jì)原則大致如下:

  • 滿足唯一和非空約束;
  • 主鍵字段應(yīng)盡可能地??;
  • 主鍵字段值基本不會(huì)被修改;
  • 優(yōu)先考慮自增字段,或查詢(xún)最頻繁的字段。

2.3 存儲(chǔ)方式

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

  • 獨(dú)享表空間的存儲(chǔ)方式:表結(jié)構(gòu)保存在 .frm 文件中,每個(gè)表的數(shù)據(jù)和索引單獨(dú)保存在 .ibd 文件中;
  • 共享表空間的存儲(chǔ)方式:表結(jié)構(gòu)保存在 .frm 文件中,數(shù)據(jù)和索引保存在表空間 ibdata 文件中。

使用共享表空間時(shí),隨著數(shù)據(jù)的不斷增長(zhǎng),表空間的維護(hù)會(huì)越來(lái)越困難,一般情況,都建議使用獨(dú)享表空間??梢酝ㄟ^(guò)配置參數(shù) innodb_file_per_table 來(lái)開(kāi)啟獨(dú)享表空間。

innodb_file_per_table = 1 #1為開(kāi)啟獨(dú)享表空間

使用獨(dú)享表空間時(shí),可以很方便對(duì)單表進(jìn)行備份和恢復(fù)操作,但是直接復(fù)制 .ibd 文件是不行的,因?yàn)槿鄙俟蚕肀砜臻g的數(shù)據(jù)字典信息,但是可以通過(guò)下面的命令,實(shí)現(xiàn) .ibd 文件和 .frm 文件能被正確識(shí)別和恢復(fù)。

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

3. 小結(jié)

本小節(jié)介紹了常用存儲(chǔ)引擎的對(duì)比,以及 InnoDB 存儲(chǔ)引擎區(qū)別于其他存儲(chǔ)引擎的特點(diǎn):自動(dòng)增長(zhǎng)列、主鍵和索引、存儲(chǔ)方式。