1. 有哪些常見的存儲引擎?
-
MyISAM:這種引擎是mysql最早提供的。這種引擎又可以分為靜態(tài)MyISAM、動態(tài)MyISAM 和壓縮MyISAM三種,不管是何種MyISAM表,目前它都不支持事務(wù),行級鎖和外鍵約束的功能。
-
MyISAM Merge引擎:這種類型是MyISAM類型的一種變種。合并表是將幾個相同的MyISAM表合并為一個虛表。常應(yīng)用于日志和數(shù)據(jù)倉庫。
-
InnoDB:InnoDB表類型可以看作是對MyISAM的進(jìn)一步更新產(chǎn)品,它提供了事務(wù)、行級鎖機(jī)制和外鍵約束的功能,也是目前MySQL 默認(rèn) 的存儲引擎。
-
Memory(heap):這種類型的數(shù)據(jù)表只存在于內(nèi)存中。它使用散列索引,所以數(shù)據(jù)的存取速度非???。因?yàn)槭谴嬖谟趦?nèi)存中,所以這種類型常應(yīng)用于臨時表中。
-
archive:這種類型只支持select 和 insert語句,而且不支持索引。常應(yīng)用于日志記錄和聚合分析方面。
2. MyISAM 和 InnoDB 的區(qū)別?
1)InnoDB 支持事務(wù),而 MyISAM 不支持。
2)InnoDB 支持外鍵,而 MyISAM 不支持。因此將一個含有外鍵的 InnoDB 表 轉(zhuǎn)為 MyISAM 表會失敗。
3)InnoDB 和 MyISAM 均支持 B+ Tree 數(shù)據(jù)結(jié)構(gòu)的索引。但 InnoDB 是聚集索引,而 MyISAM 是非聚集索引。
4)InnoDB 不保存表中數(shù)據(jù)行數(shù),執(zhí)行 select count(*) from table 時需要全表掃描。而 MyISAM 用一個變量記錄了整個表的行數(shù),速度相當(dāng)快(注意不能有 WHERE 子句)。
那為什么 InnoDB 沒有使用這樣的變量呢?因?yàn)镮nnoDB的事務(wù)特性,在同一時刻表中的行數(shù)對于不同的事務(wù)而言是不一樣的。
5)InnoDB 支持表、行(默認(rèn))級鎖,而 MyISAM 支持表級鎖。
InnoDB 的行鎖是基于索引實(shí)現(xiàn)的,而不是物理行記錄上。即訪問如果沒有命中索引,則也無法使用行鎖,將要退化為表鎖。
6)InnoDB 必須有唯一索引(如主鍵),如果沒有指定,就會自動尋找或生產(chǎn)一個隱藏列 Row_id 來充當(dāng)默認(rèn)主鍵,而 Myisam 可以沒有主鍵。
3. InnoDB引擎四大特性
-
插入緩沖insert buffer)
-
二次寫(double write)
-
自適應(yīng)哈希索引(ahi)
-
預(yù)讀(read ahead)
4.?InnoDB為何推薦使用自增主鍵?
自增 ID 可以保證每次插入時 B+ 樹索引是從右邊擴(kuò)展的,因此相比自定義 ID (如 UUID)可以避免 B+ 樹的頻繁合并和分裂。如果使用字符串主鍵和隨機(jī)主鍵,會使得數(shù)據(jù)隨機(jī)插入,效率比較差。
4.?存儲結(jié)構(gòu)
4.1. 什么是 InnoDB 的頁、區(qū)、段?
-
頁(Page)
-
首先,InnoDB 將物理磁盤劃分為頁(page),每頁的大小默認(rèn)為 16 KB,頁是最小的存儲單位。頁根據(jù)上層應(yīng)用的需要,如索引、日志等,分為很多的格式。我們主要說數(shù)據(jù)頁,也就是存儲實(shí)際數(shù)據(jù)的頁。
-
-
區(qū)(Extent)
-
如果只有頁這一個層次的話,頁的個數(shù)是非常多的,存儲空間的分配和回收都會很麻煩,因?yàn)橐S護(hù)這么多的頁的狀態(tài)是非常麻煩的。
-
所以,InnoDB 又引入了區(qū)(Extent) 的概念。一個區(qū)默認(rèn)是 64 個連續(xù)的頁組成的,也就是 1MB。通過 Extent 對存儲空間的分配和回收就比較容易了。
-
-
段(Segment)
-
為什么要引入段呢,這要從索引說起。我們都知道索引的目的是為了加快查找速度,是一種典型的用空間換時間的方法。
-
B+ 樹的葉子節(jié)點(diǎn)存放的是我們的具體數(shù)據(jù),非葉子結(jié)點(diǎn)是索引頁。所以 B+ 樹將數(shù)據(jù)分為了兩部分,葉子節(jié)點(diǎn)部分和非葉子節(jié)點(diǎn)部分,也就我們要介紹的段 Segment,也就是說 InnoBD 中每一個索引都會創(chuàng)建兩個 Segment 來存放對應(yīng)的兩部分?jǐn)?shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-583602.html
-
Segment 是一種邏輯上的組織,其層次結(jié)構(gòu)從上到下一次為 Segment、Extent、Page。文章來源地址http://www.zghlxwxcb.cn/news/detail-583602.html
-
到了這里,關(guān)于MySQL的存儲引擎的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!