官术网_书友最值得收藏!

InnoDB引擎

InnoDB是MySQL的默認事務(wù)型存儲引擎,也是最重要、使用最廣泛的引擎。它是為處理大量短期事務(wù)而設(shè)計的,這些事務(wù)通常是正常提交的,很少會被回滾。InnoDB的性能和自動崩潰恢復(fù)特性,使得它在非事務(wù)型存儲需求中也很流行。如果想研究存儲引擎,比起花同樣時間學習所有的存儲引擎,深入研究以盡可能多地了解InnoDB是更值得的選擇。

最佳實踐是使用InnoDB存儲引擎作為所有應(yīng)用程序的默認引擎。在好幾個大版本之前,MySQL已經(jīng)將InnoDB作為默認引擎,這讓事情變得簡單了。

InnoDB是MySQL默認的通用存儲引擎。默認情況下,InnoDB將數(shù)據(jù)存儲在一系列的數(shù)據(jù)文件中,這些文件統(tǒng)被稱為表空間(tablespace)。表空間本質(zhì)上是一個由InnoDB自己管理的黑盒。

InnoDB使用MVCC來實現(xiàn)高并發(fā)性,并實現(xiàn)了所有4個SQL標準隔離級別。InnoDB默認為REPEATABLE READ隔離級別,并且通過間隙鎖(next-key locking)策略來防止在這個隔離級別上的幻讀:InnoDB不只鎖定在查詢中涉及的行,還會對索引結(jié)構(gòu)中的間隙進行鎖定,以防止幻行被插入。

InnoDB表是基于聚簇索引構(gòu)建的,我們將在第8章討論schema設(shè)計時詳細介紹聚簇索引。InnoDB的索引結(jié)構(gòu)與MySQL其他大部分存儲引擎有很大的不同。聚簇索引提供了非常快速的主鍵查找。但是,因為二級索引(secondary index,非主鍵索引)需要包含主鍵列,如果主鍵較大,則其他索引也會很大。如果表中的索引較多,主鍵應(yīng)當盡量小。

InnoDB內(nèi)部做了很多優(yōu)化。其中包括從磁盤預(yù)取數(shù)據(jù)的可預(yù)測性預(yù)讀、能夠自動在內(nèi)存中構(gòu)建哈希索引以進行快速查找的自適應(yīng)哈希索引(adaptive hash index),以及用于加速插入操作的插入緩沖區(qū)(insert buffer)。我們將在本書第4章討論這些內(nèi)容。

InnoDB的行為是非常復(fù)雜的,如果你正在使用InnoDB,強烈建議閱讀MySQL官方手冊中“InnoDB鎖定和事務(wù)模型”(參見鏈接5)一節(jié)。由于其MVCC架構(gòu),在使用InnoDB構(gòu)建應(yīng)用程序之前,有許多微妙之處需要注意。存儲引擎要為所有用戶甚至包括修改數(shù)據(jù)的用戶維持一致性的視圖,這是非常復(fù)雜的工作。

作為事務(wù)型存儲引擎,InnoDB可以通過一些機制和工具支持真正的在線“熱”備份,包括Oracle專有的MySQL Enterprise Backup和開源的Percona XtraBackup。我們將在第10章詳細介紹備份和恢復(fù)。

從MySQL 5.6開始,InnoDB引入了在線DDL,它最初只支持有限的使用場景,但在5.7和8.0版本中進行了擴充。就地(in-place)更改schema的機制允許在不使用完整表鎖和外部工具的情況下進行特定的表更改操作,這大大提高了MySQL InnoDB表的可操作性。在第6章中,我們將介紹在線更改schema的選項,包括本機工具和外部工具。

主站蜘蛛池模板: 徐水县| 海兴县| 达州市| 余干县| 保靖县| 扬中市| 响水县| 永康市| 龙南县| 金寨县| 榆社县| 乾安县| 昆山市| 永济市| 兴仁县| 札达县| 烟台市| 容城县| 丹寨县| 延吉市| 延庆县| 巴南区| 抚州市| 大同市| 璧山县| 乌鲁木齐市| 永顺县| 西贡区| 娄烦县| 长葛市| 阿荣旗| 兰考县| 卓尼县| 庆元县| 亚东县| 宁波市| 高州市| 岐山县| 玉门市| 定兴县| 阿克陶县|