MySQL數(shù)據(jù)表存儲(chǔ)引擎類型及特性
數(shù)據(jù)表類型(存儲(chǔ)引擎)
數(shù)據(jù)庫引擎用于存儲(chǔ)、處理和保護(hù)數(shù)據(jù)的核心服務(wù),利用數(shù)據(jù)庫引擎可控制訪問權(quán)限并快速處理事務(wù),利用數(shù)據(jù)庫引擎創(chuàng)建用于聯(lián)機(jī)事務(wù)處理或聯(lián)機(jī)分析處理數(shù)據(jù)的關(guān)系數(shù)據(jù)庫,包括創(chuàng)建用于存儲(chǔ)數(shù)據(jù)的表和用于查看、管理、保護(hù)數(shù)據(jù)安全的數(shù)據(jù)庫對(duì)象(索引、視圖、存儲(chǔ)過程)。
常見引擎比對(duì)
特性 | Myisam | InnoDB | Memory | BDB | Archive |
---|---|---|---|---|---|
存儲(chǔ)限制 | ***制 | 64TB | 有 | 沒有 | 沒有 |
事務(wù)安全 | - | 支持 | - | 支持 | - |
鎖機(jī)制 | 表鎖 | 行鎖 | 表鎖 | 頁鎖 | 行鎖 |
B樹索引 | 支持 | 支持 | 支持 | 支持 | - |
哈希索引 | - | 支持 | 支持 | - | - |
全文索引 | 支持 | - | - | - | - |
集群索引 | - | 支持 | - | - | - |
數(shù)據(jù)緩存 | - | 支持 | 支持 | - | - |
索引緩存 | 支持 | 支持 | 支持 | - | - |
數(shù)據(jù)壓縮 | 支持 | - | - | - | 支持 |
空間使用 | 低 | 高 | N/A | 低 | 非常低 |
內(nèi)存使用 | 低 | 高 | 中 | 低 | 低 |
批量插入速度 | 高 | 低 | 高 | 高 | 非常高 |
外鍵支持 | - | 支持 | - | - | - |
各引擎特點(diǎn)
- Myisam
mysql默認(rèn)存儲(chǔ)引擎,在磁盤上存儲(chǔ)成三個(gè)文件.frm(存儲(chǔ)表定義).MYD(MYData存儲(chǔ)數(shù)據(jù))。MYI(MYIndex存儲(chǔ)索引);
沒有事務(wù)支持,不支持行鎖外鍵,因此當(dāng)insert、update會(huì)鎖定整個(gè)表,效率會(huì)低一些,MyIASM中存儲(chǔ)了行數(shù),如果表的讀操作遠(yuǎn)大于寫且不需要事務(wù),MyISAM優(yōu)選。
索引
1.MyISAM引擎索引結(jié)構(gòu)為B+Tree,其中B+Tree的數(shù)據(jù)域存儲(chǔ)的為實(shí)際數(shù)據(jù)地址即索引和實(shí)際數(shù)據(jù)分開即非聚集索引。
2.如圖主鍵索引和輔助索引結(jié)構(gòu)一直只不過主鍵索引要求key唯一。
3.MyISAM中索引檢索算法首先安裝B+Tree搜索算法搜索索引,如果key存在,則取出data域的值,然后以data域的值為地址,讀取相應(yīng)數(shù)據(jù)記錄。
- Innodb
提供了對(duì)數(shù)據(jù)庫ACID事務(wù)支持并實(shí)現(xiàn)SQL標(biāo)準(zhǔn)的四種隔離級(jí)別,提供行級(jí)鎖和外鍵約束。Mysql運(yùn)行時(shí)Innodb會(huì)在內(nèi)存中建立緩沖池用于緩沖數(shù)據(jù)和索引,該引擎不支持fulltext類型索引且沒有保存表的行數(shù),select count(*) from table 血藥掃全表。
需要事務(wù)操作時(shí)Innodb***,鎖力度小,寫操作不會(huì)鎖定權(quán)標(biāo),所以并發(fā)高時(shí)Innodb引擎效率更高,
相比Myisam寫處理效率差一些會(huì)占用更多的磁盤空間保存數(shù)據(jù)和索引。
索引
1.Innodb索引采用B+Tree且Innodb索引文件本身就是數(shù)據(jù)文件即B+Tree的數(shù)據(jù)域存儲(chǔ)的就是實(shí)際的數(shù)據(jù)如圖Primary Key即聚集索引。這個(gè)索引的key就是數(shù)據(jù)表主鍵,Innodb表本身就是主索引。
2.Innodb輔助索引數(shù)據(jù)域存儲(chǔ)的是相應(yīng)的主鍵的值而不是地址,通過輔助索引查找時(shí)先找到主鍵再通過主鍵查找數(shù)據(jù)。所以主鍵不建議過長否則輔助索引會(huì)變得很大。
3.Innodb必須有主鍵如果沒有顯示指定Mysql會(huì)自動(dòng)選擇一個(gè)唯一標(biāo)識(shí)的數(shù)據(jù)記錄為主鍵。
4.聚集索引按主鍵搜索效率十分高效,輔助索引必須檢索兩遍。
5.基于Innodb索引結(jié)構(gòu)可以解釋為什么不建議使用過長的主鍵,為什么不建議使用非單調(diào)(非遞增)的記錄做主鍵,B+Tree索引結(jié)構(gòu)導(dǎo)致使用非單調(diào)做主鍵會(huì)相當(dāng)?shù)托А?/p>
常用命令
- show engines; 查看當(dāng)前支持的引擎和默認(rèn)引擎
- show table status from mytest; show create table tablename;查看數(shù)據(jù)表引擎
- 修改默認(rèn)引擎 my.ini [mysqld]下增加 default-storage-engine=InnoDB
名詞概念
- ACID: (Atomicity)原子性,要么全部執(zhí)行要么不執(zhí)行;(Consistency)一致性,事務(wù)的運(yùn)行不改變數(shù)據(jù)庫中數(shù)據(jù)的一致性;(Isolation)獨(dú)立性,也稱隔離性兩個(gè)以上的食物不會(huì)出現(xiàn)交錯(cuò)執(zhí)行的狀態(tài);(Durability)持久性,事務(wù)執(zhí)行成功后數(shù)據(jù)持久保存。
- BTree 二叉搜索樹
1.所有非葉子幾點(diǎn)最多有兩個(gè)子節(jié)點(diǎn)(left right)
2.所有節(jié)點(diǎn)存儲(chǔ)一個(gè)關(guān)鍵字
3.非葉子節(jié)點(diǎn)左指針指向小于其關(guān)鍵字的子樹,右指針指向大于其關(guān)鍵字的子樹
二叉樹查找:從跟節(jié)點(diǎn)開始查詢關(guān)鍵字與節(jié)點(diǎn)相等,***返回。否則查詢關(guān)鍵字比節(jié)點(diǎn)小,進(jìn)入左子節(jié)點(diǎn)否則進(jìn)入右節(jié)點(diǎn)。如果左或右為空反饋找不到。如果樹左右節(jié)點(diǎn)保持平衡如圖1、3棵樹查詢性能逼近二分查找。樹比二分查找的有點(diǎn)是數(shù)據(jù)更新時(shí)不需要移動(dòng)大段內(nèi)存數(shù)據(jù)如3、4圖數(shù)據(jù)更新。
經(jīng)過一系列的更新可能導(dǎo)致圖2的BTree樹,該樹搜索成線性無查詢優(yōu)勢,在實(shí)際使用中通常使用平衡二叉樹如圖1、3即“平衡二叉樹”,平衡算法是一種在B樹種插入和刪除節(jié)點(diǎn)的策略。
- B-Tree 多路搜索樹(非二叉樹)
1.任意非葉子節(jié)點(diǎn)最多只有M個(gè)子節(jié)點(diǎn)且M>2
2.跟節(jié)點(diǎn)的子節(jié)點(diǎn)數(shù)為[2, M]
3.除跟節(jié)點(diǎn)外的非葉子節(jié)點(diǎn)的子節(jié)點(diǎn)樹為[M/2, M]
4.每個(gè)節(jié)點(diǎn)存放至少M(fèi)/2-1(取上整)和至多M-1個(gè)關(guān)鍵字(至少2個(gè)關(guān)鍵字)
5.非葉子節(jié)點(diǎn)的關(guān)鍵字個(gè)數(shù)=指向兒子的指針個(gè)數(shù)-1
6.非葉子節(jié)點(diǎn)的關(guān)鍵字:K[1],K[2],…,K[M-1]且K[i]<K[i+1]
7.非葉子幾點(diǎn)的指針:P[1],P[2],…,P[M],其中P[1]指向關(guān)鍵字小于K[1]的子樹,P[M]指向管關(guān)鍵字大于K[M-1]的子樹,其他P[i]指向關(guān)鍵字屬于(K[i-1], K[i])的子樹
8.所有葉子節(jié)點(diǎn)位于同一層
B-Tree查找:從跟節(jié)點(diǎn)開始,對(duì)節(jié)點(diǎn)內(nèi)的關(guān)鍵字(有序)進(jìn)行二分查找,***結(jié)束。否則進(jìn)入查詢關(guān)鍵字所屬范圍的兒子節(jié)點(diǎn);重復(fù)直到空或葉子節(jié)點(diǎn)。
由于限制除根節(jié)點(diǎn)外的非葉子節(jié)點(diǎn)至少含有M/2個(gè)兒子,確保了節(jié)點(diǎn)的至少利用率所以B-Tree的性能等價(jià)于二分查找,也就沒有B樹平衡的問題。由于M/2的限制,插入或刪除節(jié)點(diǎn)時(shí)需要考慮分裂和合并節(jié)點(diǎn)。
B-Tree特性:關(guān)鍵字集合分布在整科樹種;任何一個(gè)關(guān)鍵字出現(xiàn)且只出現(xiàn)在一個(gè)節(jié)點(diǎn)中;搜索有可能在非葉子節(jié)點(diǎn)結(jié)束;搜索性能等價(jià)于在關(guān)鍵字全集內(nèi)做一次二分查找;自動(dòng)層次控制;
- B+Tree B-Tree變體多路搜索樹
1.基本與B-Tree定義相同除以下外
2.非葉子節(jié)點(diǎn)的子樹指針與關(guān)鍵字個(gè)數(shù)相同
3.非葉子節(jié)點(diǎn)的子樹指針P[i]指向關(guān)鍵字值屬于(K[i], K[i+1])的子樹
4.為所有葉子節(jié)點(diǎn)增加一個(gè)鏈指針
5.所有關(guān)鍵字都在葉子節(jié)點(diǎn)出現(xiàn)
B+Tree查找:與B-Tree相同區(qū)別B+樹只有達(dá)到葉子節(jié)點(diǎn)才***,其性能等價(jià)于關(guān)鍵字全集做一次二分查找。
B+Tree特性:所有關(guān)鍵字都出現(xiàn)在葉子節(jié)點(diǎn)鏈表中,鏈表中關(guān)鍵字有序;不可能在非葉子節(jié)點(diǎn)***;非葉子節(jié)點(diǎn)相當(dāng)于是葉子節(jié)點(diǎn)的索引,葉子節(jié)點(diǎn)相當(dāng)于是存儲(chǔ)關(guān)鍵字?jǐn)?shù)據(jù)的數(shù)據(jù)層;更適合文件索引系統(tǒng);
- B*Tree B+Tree變體
1.在B+Tree的非跟和非葉子節(jié)點(diǎn)增加指向兄弟的指針
B+Tree分裂:當(dāng)一個(gè)節(jié)點(diǎn)滿時(shí),分配一個(gè)新的節(jié)點(diǎn),將原節(jié)點(diǎn)中1/2的數(shù)據(jù)復(fù)制到新節(jié)點(diǎn),***在父節(jié)點(diǎn)中增加新節(jié)點(diǎn)指針;B+樹分類只影響原節(jié)點(diǎn)和父節(jié)點(diǎn)不影響兄弟節(jié)點(diǎn)。
B*Tree分裂:一個(gè)節(jié)點(diǎn)滿時(shí),如果下一個(gè)兄弟節(jié)點(diǎn)未滿,將一部分?jǐn)?shù)據(jù)移到兄弟幾點(diǎn)中,再在源節(jié)點(diǎn)插入關(guān)鍵字,***修改父節(jié)點(diǎn)中兄弟節(jié)點(diǎn)的關(guān)鍵字;如果兄弟節(jié)點(diǎn)也滿了,則在源節(jié)點(diǎn)與兄弟節(jié)點(diǎn)之間增加新節(jié)點(diǎn),并各賦值1/3的數(shù)據(jù)到新節(jié)點(diǎn),***在父節(jié)點(diǎn)增加新節(jié)點(diǎn)的指針。B*Tree分配節(jié)點(diǎn)的概率比B+Tree要低,空間使用率高。
各個(gè)樹比對(duì)
-
各個(gè)樹比對(duì)
類型 | 特點(diǎn) |
---|---|
BTree | 每個(gè)節(jié)點(diǎn)只存儲(chǔ)一個(gè)關(guān)鍵字,等于***,小于左節(jié)點(diǎn),大于右節(jié)點(diǎn) |
B-Tree | 多路搜索樹,每個(gè)節(jié)點(diǎn)存儲(chǔ)M/2到M個(gè)關(guān)鍵字,非葉子節(jié)點(diǎn)存儲(chǔ)指向關(guān)鍵字范圍的子節(jié)點(diǎn),所有關(guān)鍵字在整棵樹中出現(xiàn),且只出現(xiàn)一次,非葉子節(jié)點(diǎn)可以*** |
B+Tree | B-Tree基礎(chǔ)上尉葉子節(jié)點(diǎn)增加鏈表指針,所有關(guān)鍵字都在葉子節(jié)點(diǎn)出現(xiàn),非葉子節(jié)點(diǎn)作為葉子節(jié)點(diǎn)的索引,B+Tree葉子節(jié)點(diǎn)才*** |
B*Tree | B+Tree基礎(chǔ)上為非也自己點(diǎn)也增加鏈表指針,將節(jié)點(diǎn)的***利用率從1/2提高到2/3 |