C-05.存儲(chǔ)引擎
為了方便管理,把連接管理
,查詢緩存
,語(yǔ)法解析
,查詢優(yōu)化
這些不涉及真實(shí)數(shù)據(jù)存儲(chǔ)的功能劃分為MySQL Server
的功能,把真實(shí)存取數(shù)據(jù)的功能劃分為存儲(chǔ)引擎
的功能。所以在MySQL Server
完成了查詢優(yōu)化后,只需按照生成的執(zhí)行計(jì)劃
調(diào)用底層存儲(chǔ)引擎提供的API,獲取到數(shù)據(jù)后返回給客戶端就好了。
MySQL中提到了存儲(chǔ)引擎的概念。簡(jiǎn)而言之,存儲(chǔ)引擎就是表的類型
。其實(shí)存儲(chǔ)引擎之前叫做表處理器
,后來(lái)改名為存儲(chǔ)引擎
,它的功能就是接收上層傳下倆的指令,然后對(duì)表中的數(shù)據(jù)進(jìn)行提取或?qū)懭氩僮鳌?/p>
1.查看存儲(chǔ)引擎
- 查看存儲(chǔ)引擎指令
show engines;
查詢結(jié)果,MySQL8.0支持9種存儲(chǔ)引擎,分別是FEDERATED
,MEMORY
,InnoDB
,PERFORMANCE_SCHEMA
,MyISAM
,MRG_MYISAM
,BLACKHOLE
,CSV
和ARCHIVE
。
-
Engine參數(shù)
表示存儲(chǔ)引擎名稱。 -
Support參數(shù)
表示MySQL數(shù)據(jù)庫(kù)管理系統(tǒng)是否支持該存儲(chǔ)引擎:YES表示支持,NO表示不支持。DEFAULT表示系統(tǒng)默認(rèn)支持的存儲(chǔ)引擎 -
Comment參數(shù)
,表示對(duì)存儲(chǔ)引擎的評(píng)論。 -
Transactions參數(shù)
,表示是否支持事務(wù)。 -
XA參數(shù)
,表示存儲(chǔ)引擎所支持的分布式是否符合XA規(guī)范,YES支持,NO不支持。代表該存儲(chǔ)引擎是否支持分布式事務(wù)。 -
Savepoints參數(shù)
,表示存儲(chǔ)引擎是否支持事務(wù)處理的保存點(diǎn),YES支持,NO不支持。也就是說(shuō)存儲(chǔ)引擎,是否支持部分回滾事務(wù)。
mysql> show engines\G
*************************** 1. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 2. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 4. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 8. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 9. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
9 rows in set (0.00 sec)
2.設(shè)置系統(tǒng)默認(rèn)的存儲(chǔ)引擎
- 查看默認(rèn)的存儲(chǔ)引擎
show variables like '%storage_engine%';
#或者
select @@global.default_storage_engine;
mysql> select @@global.default_storage_engine;
+---------------------------------+
| @@global.default_storage_engine |
+---------------------------------+
| InnoDB |
+---------------------------------+
1 row in set (0.00 sec)
- 修改默認(rèn)的存儲(chǔ)引擎
如果在創(chuàng)建表的語(yǔ)句中,未指定存儲(chǔ)引擎的話,就會(huì)默認(rèn)使用Innodb作為表的存儲(chǔ)引擎。如果我們想改變表的默認(rèn)存儲(chǔ)引擎的話,可以這樣在執(zhí)行下面的sql語(yǔ)句
SET DEFAULT_STORAGE_ENGINE = MyISAM;
或者修改my.cnf
文件
default-storage-engine=MyIASM #之后重啟msyqld服務(wù)
如果創(chuàng)建表時(shí),未指明當(dāng)前表的類型(存儲(chǔ)引擎),則使用當(dāng)前MySQL服務(wù)默認(rèn)的存儲(chǔ)引擎。
3.設(shè)置表的存儲(chǔ)引擎
存儲(chǔ)引擎是負(fù)責(zé)對(duì)表中的數(shù)據(jù)進(jìn)行提取和寫(xiě)入工作的,我們可以為不同的表設(shè)置不同的存儲(chǔ)引擎
,也就是說(shuō)不同的表可以有不同的物理存儲(chǔ)結(jié)構(gòu),不同的提取和寫(xiě)入方式。
3.1 創(chuàng)建表時(shí)指定存儲(chǔ)引擎
CREATE TABLE 表名(
建表語(yǔ)句
) ENGINE = 存儲(chǔ)引擎名稱;
#例子
CREATE TABLE demo2(id int) ENGINE = myisam;
3.2 修改表的存儲(chǔ)引擎
alter table table_name
engine = myisam;
#例子
ALTER TABLE demo2 ENGINE = innodb;
4.引擎介紹
4.1 InnoDB引擎:具備外鍵支持功能的事務(wù)存儲(chǔ)引擎(常用)
-
MySQL從3.23.34a開(kāi)始包含Innodb存儲(chǔ)引擎。
版本大于等于5.5之后,默認(rèn)采用InnoDB存儲(chǔ)引擎
。 -
InnoDB是MySQL的
默認(rèn)事務(wù)型引擎
,它被設(shè)計(jì)用來(lái)處理大量的短期(short-lived)事務(wù)??梢源_保事務(wù)的完整提交(Commit)和回滾(Rollback)。 -
除了增加和查詢外,還需要更新,刪除操作,則優(yōu)先選擇InnoDB存儲(chǔ)引擎。
-
除非有非常特別的原因需要使用其他的存儲(chǔ)引擎,否則應(yīng)該優(yōu)先考慮InnoDB引擎。
-
數(shù)據(jù)文件結(jié)構(gòu):(在《第02章_MySQL數(shù)據(jù)目錄》)
- 表名.frm存儲(chǔ)表結(jié)構(gòu)(MySQL8.0時(shí),合并在表名.ibd中)
- 表名.ibd存儲(chǔ)數(shù)據(jù)和索引
-
InnoDB是
為處理巨大數(shù)據(jù)量的最大性能設(shè)計(jì)
。-
在之前的版本中,字典數(shù)據(jù)以元數(shù)據(jù)文件,非事務(wù)表等來(lái)存儲(chǔ)?,F(xiàn)在這些元數(shù)據(jù)文件被刪除了。比如:
.frm
,.par
,.trn
.isl
,db.opt
等在MySQL8.0中不存在了
-
-
對(duì)比MyISAM的存儲(chǔ)引擎,
InnoDB寫(xiě)的處理效率會(huì)差一些
,并且會(huì)占用更多的磁盤空間以保存數(shù)據(jù)和索引。 -
MyISAM只緩存索引,不緩存真實(shí)數(shù)據(jù);InnoDB不加緩存索引還要緩存真實(shí)數(shù)據(jù),
對(duì)內(nèi)存要求較高
,而且內(nèi)存大小對(duì)性能有決定性的影響。
4.2 MyISAM引擎:主要的非事務(wù)處理存儲(chǔ)引擎(常用)
-
MyISAM提供了大量的特性,包括全文索引,壓縮,空間函數(shù)(GIS)等,但MyIASM
不支持事務(wù)、行級(jí)鎖、外鍵
,有一個(gè)毫無(wú)疑問(wèn)的缺陷就是崩潰后無(wú)法安全恢復(fù)
。 -
5.5之前默認(rèn)的存儲(chǔ)引擎
。 -
優(yōu)勢(shì)是訪問(wèn)的速度快,對(duì)事務(wù)完整性沒(méi)有要求或者以SELECT,INSERT為主的應(yīng)用。
-
針對(duì)數(shù)據(jù)統(tǒng)計(jì)有額外的常數(shù)存儲(chǔ)。所以,count(*)的查詢效率很高。
-
數(shù)據(jù)文件結(jié)構(gòu):
- 表名.frm存儲(chǔ)表結(jié)構(gòu)
- 表名.MYD存儲(chǔ)數(shù)據(jù)(MYDATA)
- 表名.MYI存儲(chǔ)索引(MYINDEX)
-
應(yīng)用場(chǎng)景:只讀應(yīng)用或者以讀為主的業(yè)務(wù)
4.3 Archive引擎:用于數(shù)據(jù)存檔(了解)
-
archive
是歸檔的意思,僅僅支持插入
和查詢
兩種功能(行數(shù)據(jù)插入后,不能修改)。 - 在MySQL5.5以后
支持索引
功能。 - 擁有很好的壓縮機(jī)制,使用
zlib壓縮庫(kù)
,在記錄請(qǐng)求的時(shí)候?qū)崟r(shí)的進(jìn)行壓縮,經(jīng)常被用來(lái)倉(cāng)庫(kù)使用。 - 創(chuàng)建Archive類型的表,存儲(chǔ)引擎會(huì)創(chuàng)建名稱以表名開(kāi)頭的文件。數(shù)據(jù)文件的擴(kuò)展名為
.ARZ
。 - 根據(jù)英文的測(cè)試結(jié)論來(lái)看,同樣數(shù)據(jù)量下,
Archive表比MyIASM表小約75%
,比支持事務(wù)處理的InnoDB表小約83%
。 - Archive存儲(chǔ)引擎采用了
行級(jí)鎖
。該Archive引擎支持AUTO_INCREMENT
列屬性。AUTO_INCREMENT列可以具有唯一索引或非唯一索引。嘗試在任何其他列上創(chuàng)建索引,會(huì)導(dǎo)致錯(cuò)誤。 - Archive表
適合日志和數(shù)據(jù)采集(檔案)
類應(yīng)用;適合存儲(chǔ)大量的獨(dú)立的作為歷史記錄的數(shù)據(jù)。擁有很高的插入速度
,但是對(duì)查詢的支持較差。 -
下圖展示了Archive存儲(chǔ)引擎的功能
4.4 Blackhole引擎:丟棄寫(xiě)操作,讀操作會(huì)返回空內(nèi)容
- Blackhole引擎沒(méi)有實(shí)現(xiàn)任何存儲(chǔ)機(jī)制,它會(huì)
丟棄所有插入的數(shù)據(jù)
,不做任何保存。 - 但服務(wù)器會(huì)記錄Blackhole表的日志,所有可以用于復(fù)制數(shù)據(jù)到備庫(kù),或者簡(jiǎn)單地記錄到日志。這種應(yīng)用方式會(huì)有很多問(wèn)題,此存儲(chǔ)引擎不推薦使用。
4.5 CSV引擎:存儲(chǔ)數(shù)據(jù)時(shí),以逗號(hào)分割各個(gè)數(shù)據(jù)項(xiàng)(了解)
- CSV引擎可以將
普通的CSV文件作為MySQL的表來(lái)處理
,但不支持索引。 - CSV引擎可以作為一種
數(shù)據(jù)交換的格式
,非常有用。 - CSV存儲(chǔ)的數(shù)據(jù)直接可以在OS里,用文本編輯器,或者execl讀取。
- 對(duì)于數(shù)據(jù)的快速導(dǎo)入,導(dǎo)出有明顯的優(yōu)勢(shì)。
創(chuàng)建CSV表時(shí),服務(wù)器會(huì)創(chuàng)建一個(gè)純文本數(shù)據(jù)文件,其名稱以表名開(kāi)頭并帶有.CSV
擴(kuò)展名。當(dāng)你將數(shù)據(jù)存儲(chǔ)到表中時(shí),存儲(chǔ)引擎將其以逗號(hào)分隔值格式保存到數(shù)據(jù)文件中。
使用案例如下
注意,在創(chuàng)建CSV類型的表示,所有字段必須設(shè)置為非空約束。
mysql> create table CSV_demo(id int not null,name varchar(20) not null) engine = CSV;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into CSV_demo(id,name) values(1,'wind'),(2,'flower');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from CSV_demo;
+----+--------+
| id | name |
+----+--------+
| 1 | wind |
| 2 | flower |
+----+--------+
2 rows in set (0.01 sec)
4.6 Memory引擎:置于內(nèi)存的表(了解)
概述:
Memory采用的邏輯介質(zhì)是內(nèi)存
,相應(yīng)速度很快
,但是當(dāng)mysqld守護(hù)進(jìn)程崩潰的時(shí)候數(shù)據(jù)會(huì)丟失
。另外,要求存儲(chǔ)的數(shù)據(jù)是數(shù)據(jù)長(zhǎng)度不變的格式,比如,Blob和Text類型的數(shù)據(jù)不可用(長(zhǎng)度不固定的)。
主要特征:
-
Memory同時(shí)
支持哈希(HASH)索引
和B樹(shù)索引
。- 哈希索引相等條件比較快,但是對(duì)于范圍的比較慢很多。
-
默認(rèn)使用哈希(HASH)索引
,其速度要比使用B型樹(shù)(BTREE)索引快。 - 如果希望使用B樹(shù)索引,可以在創(chuàng)建索引時(shí)選擇使用。
-
Memory表至少比MyISAM表要
快一個(gè)數(shù)量級(jí)
。 -
MEMORY
表的大小是受到限制
的。表的大小主要取決于兩個(gè)參數(shù),分別是max_rows
和max_heap_table_size
。其中,max_rows可以在創(chuàng)建表時(shí)指;max_heap_table_size的大小默認(rèn)為16MB,可以按需進(jìn)行擴(kuò)大。 -
數(shù)據(jù)文件與索引文件分開(kāi)存儲(chǔ)
- 每個(gè)基于MEMORY存儲(chǔ)引擎的表實(shí)際對(duì)應(yīng)一個(gè)磁盤文件,該文件的文件名與表名相同,類型為
.frm類型
,該文件中只存儲(chǔ)表的結(jié)構(gòu),而其數(shù)據(jù)文件都是存儲(chǔ)在內(nèi)存中的
。 - 這樣有利于數(shù)據(jù)的快速處理,提高整個(gè)表的處理效率。
- 每個(gè)基于MEMORY存儲(chǔ)引擎的表實(shí)際對(duì)應(yīng)一個(gè)磁盤文件,該文件的文件名與表名相同,類型為
-
缺點(diǎn):其數(shù)據(jù)易丟失,生命周期短。由于該缺陷,選擇MEMORY存儲(chǔ)引擎時(shí)需要特別小心。
使用Memory存儲(chǔ)引擎的場(chǎng)景
1.目標(biāo)數(shù)據(jù)較小
,而且非常頻繁的進(jìn)行訪問(wèn)
,在內(nèi)存中存放數(shù)據(jù),如果太大的數(shù)據(jù)會(huì)造成內(nèi)存溢出
??梢酝ㄟ^(guò)參數(shù)max_heap_table_size控制Memory表的大小,限制Memory表的最大值。
2.如果數(shù)據(jù)是臨時(shí)的
,而且必須立即可用
得到,那么就可以放在內(nèi)存中。
3.存儲(chǔ)在Memory表中的數(shù)據(jù)如果突然間丟失的話也沒(méi)有太大的關(guān)系
。
4.7 Federated引擎:訪問(wèn)遠(yuǎn)程表
- Federated引擎是訪問(wèn)其他MySQL服務(wù)器的一個(gè)
代理
,盡管該引擎看起來(lái)提供了一種很好的跨服務(wù)器的靈活性
,但也經(jīng)常帶來(lái)問(wèn)題,因此默認(rèn)是禁用的
。
4.8 Merge引擎:管理多個(gè)MyISAM表構(gòu)成的表集合
4.9 NDB引擎:MySQL集群專用存儲(chǔ)引擎
也叫做 NDB Cluster 存儲(chǔ)引擎,主要用于MySQL Cluster
分布式集群 環(huán)境,類似于Oracle的 RAC 集群。
4.10 引擎對(duì)比
MySQL中同一個(gè)數(shù)據(jù)庫(kù),不同的表可以選擇不同的存儲(chǔ)引擎。如下表對(duì)常用存儲(chǔ)引擎做出了對(duì)比。
~代表不支持
特點(diǎn) | MyISAM | InnoDB | Memory | MERGE | NDB |
---|---|---|---|---|---|
存儲(chǔ)限制 | 有 | 64TB | 有 | 沒(méi)有 | 有 |
事務(wù)安全性 | ~ | 支持 | ~ | ~ | ~ |
鎖機(jī)制 | 表鎖,即使操作一條記錄也會(huì)鎖住整個(gè)表,不適合高并發(fā)的操作 | 行鎖,操作時(shí)只鎖某一行,不對(duì)其它行有影響,適合高并發(fā)的操作。注意在使用update語(yǔ)句,而where條件中,沒(méi)有使用索引的話,行鎖,會(huì)升級(jí)為表鎖。 | 表鎖 | 表鎖 | 行鎖 |
B樹(shù)索引 | 支持 | 支持 | 支持 | 支持 | 支持 |
哈希索引 | ~ | ~ | 支持 | ~ | 支持 |
全文索引 | 支持 | ~ | ~ | ~ | ~ |
集群索引 | ~ | 支持 | ~ | ~ | ~ |
數(shù)據(jù)索引 | ~ | 支持 | 支持 | ~ | 支持 |
索引緩存 | 只緩存索引,不緩存真實(shí)數(shù)據(jù) | 不僅緩存索引還要緩存真實(shí)數(shù)據(jù),對(duì)內(nèi)存要求較高,而且內(nèi)存大小對(duì)性能有決定性的影響 | 支持 | 支持 | 支持 |
數(shù)據(jù)可壓縮 | 支持 | ~ | ~ | ~ | ~ |
磁盤空間占用 | 低 | 高 | N/A | 低 | 低 |
內(nèi)存占用 | 低 | 高 | 中等 | 低 | 高 |
批量插入速度 | 高 | 低 | 高 | 高 | 高 |
支持外鍵 | ~ | 支持 | ~ | ~ | ~ |
其實(shí)這些東西沒(méi)必要立即就給記住,列出來(lái)的目的就是表示不同的存儲(chǔ)引擎支持不同的功能。
其實(shí)我們最常用的就是InnoDB
和MyISAM
,有時(shí)會(huì)提一下Memory
。其中InnoDB
是MySQL
默認(rèn)的存儲(chǔ)引擎。
5.MyISAM和InnoDB對(duì)比
對(duì)比項(xiàng) | MyISAM | InnoDB |
---|---|---|
外鍵 | 不支持 | 支持 |
事務(wù) | 不支持 | 支持 |
行表鎖 | 表鎖,即使操作一條記錄也會(huì)鎖住整個(gè)表,不適合高并發(fā)操作 | 行鎖,如果只操作某一行,只鎖某一行,不對(duì)其他行有影響,適合高并發(fā)操作 |
緩存 | 只緩存索引,不緩存真實(shí)數(shù)據(jù) | 不僅緩存索引,還緩存真實(shí)數(shù)據(jù),堆內(nèi)存要求較高,而且內(nèi)存大小對(duì)性能有決定性的影響 |
自帶系統(tǒng)表使用 | Y | N(在MySQL8.0后,也有系統(tǒng)表使用InnoDB引擎) |
關(guān)注點(diǎn) | 節(jié)省資源,消耗少,簡(jiǎn)單業(yè)務(wù) | 事務(wù),高并發(fā),更大數(shù)據(jù)量 |
默認(rèn)安裝 | Y | Y |
默認(rèn)使用 | N | Y |
知識(shí)引入
1.InnoDB表的優(yōu)勢(shì)
InnoDB存儲(chǔ)引擎在實(shí)際應(yīng)用中擁有諸多優(yōu)勢(shì),比如操作便利、提高了數(shù)據(jù)庫(kù)的性能、維護(hù)成本低等。如果由于硬件或軟件的原因?qū)е路?/p>
務(wù)器崩潰,那么在重啟服務(wù)器之后不需要進(jìn)行額外的操作。InnoDB崩潰恢復(fù)功能自動(dòng)將之前提交的內(nèi)容定型,然后撤銷沒(méi)有提交的進(jìn)
程,重啟之后繼續(xù)從崩潰點(diǎn)開(kāi)始執(zhí)行。
InnoDB存儲(chǔ)引擎在主內(nèi)存中維護(hù)緩沖池,高頻率使用的數(shù)據(jù)將在內(nèi)存中直接被處理。這種緩存方式應(yīng)用于多種信息,加速了處理進(jìn)程。
在專用服務(wù)器上,物理內(nèi)存中高達(dá)80%的部分被應(yīng)用于緩沖池。如果需要將數(shù)據(jù)插入不同的表中,可以設(shè)置外鍵加強(qiáng)數(shù)據(jù)的完整性。更新
或者刪除數(shù)據(jù),關(guān)聯(lián)數(shù)據(jù)將會(huì)被自動(dòng)更新或刪除。如果試圖將數(shù)據(jù)插入從表,但在主表中沒(méi)有對(duì)應(yīng)的數(shù)據(jù),插入的數(shù)據(jù)將被自動(dòng)移除。如
果磁盤或內(nèi)存中的數(shù)據(jù)出現(xiàn)崩潰,在使用臟數(shù)據(jù)之前,校驗(yàn)和機(jī)制會(huì)發(fā)出警告。當(dāng)每個(gè)表的主鍵都設(shè)置合理時(shí),與這些列有關(guān)的操作會(huì)被
自動(dòng)優(yōu)化。插入、更新和刪除操作通過(guò)做改變緩沖自動(dòng)機(jī)制進(jìn)行優(yōu)化。InnoDB不僅支持當(dāng)前讀寫(xiě),也會(huì)緩沖改變的數(shù)據(jù)到數(shù)據(jù)流磁盤
。
InnoDB的性能優(yōu)勢(shì)不只存在于長(zhǎng)時(shí)運(yùn)行查詢的大型表。在同一列多次被查詢時(shí),自適應(yīng)哈希索引會(huì)提高查詢的速度。使用InnoDB可以壓
縮表和相關(guān)的索引,可以在不影響性能和可用性的情況下創(chuàng)建或刪除索引
。對(duì)于大型文本和BLOB數(shù)據(jù),使用動(dòng)態(tài)行形式,這種存儲(chǔ)布局更高
效。通過(guò)查詢INFORMATION_SCHEMA庫(kù)中的表可以監(jiān)控存儲(chǔ)引擎的內(nèi)部工作。在同一個(gè)語(yǔ)句中,InnoDB表可以與其他存儲(chǔ)引擎表混
用。即使有些操作系統(tǒng)限制文件大小為2GB,InnoDB仍然可以處理。當(dāng)處理大數(shù)據(jù)量時(shí),InnoDB兼顧C(jī)PU,以達(dá)到最大性能
。
2.InnoDB和ACID模型
ACID模型是一系列數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)則,這些規(guī)則著重強(qiáng)調(diào)可靠性,而可靠性對(duì)于商業(yè)數(shù)據(jù)和任務(wù)關(guān)鍵型應(yīng)用非常重要。MySQL包含類似
InnoDB存儲(chǔ)引擎的組件,與ACID模型緊密相連,這樣出現(xiàn)意外時(shí),數(shù)據(jù)不會(huì)崩潰,結(jié)果不會(huì)失真。如果依賴ACID模型,可以不使用一致
性檢查和崩潰恢復(fù)機(jī)制。如果擁有額外的軟件保護(hù),極可靠的硬件或者應(yīng)用可以容忍一小部分的數(shù)據(jù)丟失和不一致,可以將MySQL設(shè)置
調(diào)整為只依賴部分ACID特性,以達(dá)到更高的性能。下面講解InnoDB存儲(chǔ)引擎與ACID模型相同作用的四個(gè)方面。
1. 原子方面 ACID的原子方面主要涉及InnoDB事務(wù),與MySQL相關(guān)的特性主要包括:
- 自動(dòng)提交設(shè)置。
- COMMIT語(yǔ)句。
- ROLLBACK語(yǔ)句。
- 操作INFORMATION_SCHEMA庫(kù)中的表數(shù)據(jù)。
2. 一致性方面 ACID模型的一致性主要涉及保護(hù)數(shù)據(jù)不崩潰的內(nèi)部InnoDB處理過(guò)程,與MySQL相關(guān)的特性
主要包括:
- InnoDB雙寫(xiě)緩存。
- InnoDB崩潰恢復(fù)。
3. 隔離方面 隔離是應(yīng)用于事務(wù)的級(jí)別,與MySQL相關(guān)的特性主要包括:
自動(dòng)提交設(shè)置。
- SET ISOLATION LEVEL語(yǔ)句。
- InnoDB鎖的低級(jí)別信息。
4. 持久性方面 ACID模型的耐久性主要涉及與硬件配置相互影響的MySQL軟件特性。由于硬件復(fù)雜多樣化,耐久性方面沒(méi)有具體的規(guī)則可循。與MySQL相關(guān)的特性有:
- InnoDB雙寫(xiě)緩存,通過(guò)innodb_doublewrite配置項(xiàng)配置。
- 配置項(xiàng)innodb_flush_log_at_trx_commit。
- 配置項(xiàng)sync_binlog。
- 配置項(xiàng)innodb_file_per_table。
- 存儲(chǔ)設(shè)備的寫(xiě)入緩存。
- 存儲(chǔ)設(shè)備的備用電池緩存。
- 運(yùn)行MySQL的操作系統(tǒng)。
- 持續(xù)的電力供應(yīng)。
- 備份策略。
- 對(duì)分布式或托管的應(yīng)用,最主要的在于硬件設(shè)備的地點(diǎn)以及網(wǎng)絡(luò)情況。
3.InnoDB架構(gòu)(了解)
1. 緩沖池 緩沖池是主內(nèi)存中的一部分空間,用來(lái)緩存已使用的表和索引數(shù)據(jù)。緩沖池使得經(jīng)常被使用的數(shù)據(jù)能夠直接在內(nèi)存中獲得,從而提高速度。
2. 更改緩存 更改緩存是一個(gè)特殊的數(shù)據(jù)結(jié)構(gòu),當(dāng)受影響的索引頁(yè)不在緩存中時(shí),更改緩存會(huì)緩存輔助索引頁(yè)的更改。索引頁(yè)被其他讀取操作時(shí)會(huì)加載到緩存池,緩存的更改內(nèi)容就會(huì)被合并。不同于集群索引,輔助索引并非獨(dú)一無(wú)二的。當(dāng)系統(tǒng)大部分閑置時(shí),清除操作會(huì)定期運(yùn)行,將更新的索引頁(yè)刷入磁盤。更新緩存合并期間,可能會(huì)大大降低查詢的性能。在內(nèi)存中,更新緩存占用一部分InnoDB緩沖池。在磁盤中,更新緩存是系統(tǒng)表空間的一部分。更新緩存的數(shù)據(jù)類型由innodb_change_buffering配置項(xiàng)管理。
3. 自適應(yīng)哈希索引 自適應(yīng)哈希索引將負(fù)載和足夠的內(nèi)存結(jié)合起來(lái),使得InnoDB像內(nèi)存數(shù)據(jù)庫(kù)一樣運(yùn)行,不需要降低事務(wù)上的性能或可靠性。這個(gè)特性通過(guò)innodb_adaptive_hash_index選項(xiàng)配置,或者通過(guò)--skip-innodb_adaptive_hash_index命令行在服務(wù)啟動(dòng)時(shí)關(guān)閉。
4. 重做日志緩存 重做日志緩存存放要放入重做日志的數(shù)據(jù)。重做日志緩存大小通過(guò)innodb_log_buffer_size配置項(xiàng)配置。重做日志緩存會(huì)定期地將日志文件刷入磁盤。大型的重做日志緩存使得大型事務(wù)能夠正常運(yùn)行而不需要寫(xiě)入磁盤。
5. 系統(tǒng)表空間 系統(tǒng)表空間包括InnoDB數(shù)據(jù)字典、雙寫(xiě)緩存、更新緩存和撤銷日志,同時(shí)也包括表和索引數(shù)據(jù)。多表共享,系統(tǒng)表空間被視為共享表空間。
6. 雙寫(xiě)緩存 雙寫(xiě)緩存位于系統(tǒng)表空間中,用于寫(xiě)入從緩存池刷新的數(shù)據(jù)頁(yè)。只有在刷新并寫(xiě)入雙寫(xiě)緩存后,InnoDB才會(huì)將數(shù)據(jù)頁(yè)寫(xiě)入合適的位置。
7. 撤銷日志 撤銷日志是一系列與事務(wù)相關(guān)的撤銷記錄的集合,包含如何撤銷事務(wù)最近的更改。如果其他事務(wù)要查詢?cè)紨?shù)據(jù),可以從撤銷日志記錄中追溯未更改的數(shù)據(jù)。撤銷日志存在于撤銷日志片段中,這些片段包含于回滾片段中。
8. 每個(gè)表一個(gè)文件的表空間 每個(gè)表一個(gè)文件的表空間是指每個(gè)單獨(dú)的表空間創(chuàng)建在自身的數(shù)據(jù)文件中,而不是系統(tǒng)表空間中。這個(gè)功能通過(guò)innodb_file_per_table配置項(xiàng)開(kāi)啟。每個(gè)表空間由一個(gè)單獨(dú)的.ibd數(shù)據(jù)文件代表,該文件默認(rèn)被創(chuàng)建在數(shù)據(jù)庫(kù)目錄中。
9. 通用表空間 使用CREATE TABLESPACE語(yǔ)法創(chuàng)建共享的InnoDB表空間。通用表空間可以創(chuàng)建在MySQL數(shù)據(jù)目錄之外能夠管理多個(gè)表并支持所有行格式的表。
10. 撤銷表空間 撤銷表空間由一個(gè)或多個(gè)包含撤銷日志的文件組成。撤銷表空間的數(shù)量由innodb_undo_tablespaces配置項(xiàng)配置。
11. 臨時(shí)表空間 用戶創(chuàng)建的臨時(shí)表空間和基于磁盤的內(nèi)部臨時(shí)表都創(chuàng)建于臨時(shí)表空間。innodb_temp_data_file_path配置項(xiàng)定義了相關(guān)的路徑、名稱、大小和屬性。如果該值為空,默認(rèn)會(huì)在innodb_data_home_dir變量指定的目錄下創(chuàng)建一個(gè)自動(dòng)擴(kuò)展的數(shù)據(jù)文件。
12. 重做日志 重做日志是基于磁盤的數(shù)據(jù)結(jié)構(gòu),在崩潰恢復(fù)期間使用,用來(lái)糾正數(shù)據(jù)。正常操作期間,重做日志會(huì)將請(qǐng)求數(shù)據(jù)進(jìn)行編碼,這些請(qǐng)求會(huì)改變InnoDB表數(shù)據(jù)。遇到意外崩潰后,未完成的更改會(huì)自動(dòng)在初始化期間重新進(jìn)行。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-855048.html
只是為了記錄自己的學(xué)習(xí)歷程,且本人水平有限,不對(duì)之處,請(qǐng)指正。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-855048.html
到了這里,關(guān)于MySQL-05.存儲(chǔ)引擎的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!