久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

mysql innodb指的是什么

141次閱讀
沒有評論

共計 4299 個字符,預(yù)計需要花費(fèi) 11 分鐘才能閱讀完成。

這篇文章主要講解了“mysql innodb 指的是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學(xué)習(xí)“mysql innodb 指的是什么”吧!

InnoDB 是 MySQL 的數(shù)據(jù)庫引擎之一,現(xiàn)為 MySQL 的默認(rèn)存儲引擎,為 MySQL AB 發(fā)布 binary 的標(biāo)準(zhǔn)之一;InnoDB 采用雙軌制授權(quán),一個是 GPL 授權(quán),另一個是專有軟件授權(quán)。InnoDB 是事務(wù)型數(shù)據(jù)庫的首選引擎,支持事務(wù)安全表(ACID);InnoDB 支持行級鎖,行級鎖可以最大程度的支持并發(fā),行級鎖是由存儲引擎層實現(xiàn)的。

如果想看自己的數(shù)據(jù)庫默認(rèn)使用的那個存儲引擎,可以通過使用命令 SHOW VARIABLES LIKE storage_engine

一、InnoDB 存儲引擎

InnoDB,是 MySQL 的數(shù)據(jù)庫引擎之一,現(xiàn)為 MySQL 的默認(rèn)存儲引擎,為 MySQL AB 發(fā)布 binary 的標(biāo)準(zhǔn)之一。InnoDB 由 Innobase Oy 公司所開發(fā),2006 年五月時由甲骨文公司并購。與傳統(tǒng)的 ISAM 與 MyISAM 相比,InnoDB 的最大特色就是支持了 ACID 兼容的事務(wù)(Transaction)功能,類似于 PostgreSQL。

InnoDB 采用雙軌制授權(quán),一個是 GPL 授權(quán),另一個是專有軟件授權(quán)。

1、InnoDB 是事務(wù)型數(shù)據(jù)庫的首選引擎,支持事務(wù)安全表(ACID)

事務(wù)的 ACID 屬性:即原子性、一致性、隔離性、持久性

                           a. 原子性:原子性也就是說這組語句要么全部執(zhí)行,要么全部不執(zhí)行,如果事務(wù)執(zhí)行到一半出現(xiàn)錯誤,數(shù)據(jù)庫就要回滾到事務(wù)開始執(zhí)行的地方。

                            實現(xiàn):主要是基于 MySQ 日志系統(tǒng)的 redo 和 undo 機(jī)制。事務(wù)是一組 SQL 語句,里面有選擇,查詢、刪除等功能。每條語句執(zhí)行會有一個節(jié)點。例如,刪除語句執(zhí)行后,在事務(wù)中有個記錄保存下來,這個記錄中儲存了我們什么時候做了什么事。如果出錯了,就會回滾到原來的位置,redo 里面已經(jīng)存儲了我做過什么事了,然后逆向執(zhí)行一遍就可以了。

                               b. 一致性:事務(wù)開始前和結(jié)束后,數(shù)據(jù)庫的完整性約束沒有被破壞。(eg: 比如 A 向 B 轉(zhuǎn)賬,不可能 A 扣了錢,B 卻沒有收到)

                               c. 隔離性:同一時間,只允許一個事務(wù)請求同一數(shù)據(jù),不同的事務(wù)之間彼此沒有任何干擾;

                                如果不考慮隔離性則會出現(xiàn)幾個問題:

                                i、臟讀:是指在一個事務(wù)處理過程里讀取了另一個未提交的事務(wù)中的數(shù)據(jù)(當(dāng)一個事務(wù)正在多次修改某個數(shù)據(jù),而在這個事務(wù)中這多次的修改都還未提交,這時一個并發(fā)的事務(wù)來訪問該數(shù)據(jù),就會造成兩個事務(wù)得到的數(shù)據(jù)不一致);(讀取了另一個事務(wù)未提交的臟數(shù)據(jù))

                               ii、不可重復(fù)讀:在對于數(shù)據(jù)庫中的某個數(shù)據(jù),一個事務(wù)范圍內(nèi)多次查詢卻返回了不同的數(shù)據(jù)值,這是由于在查詢間隔,被另一個事務(wù)修改并提交了;(讀取了前一個事務(wù)提交的數(shù)據(jù),查詢的都是同一個數(shù)據(jù)項)

                                iii、虛讀(幻讀):是事務(wù)非獨立執(zhí)行時發(fā)生的一種現(xiàn)象(eg: 事務(wù) T1 對一個表中所有的行的某個數(shù)據(jù)項做了從“1”修改為“2”的操作,這時事務(wù) T2 又對這個表中插入了一行數(shù)據(jù)項,而這個數(shù)據(jù)項的數(shù)值還是為“1”并且提交給數(shù)據(jù)庫。而操作事務(wù) T1 的用戶如果再查看剛剛修改的數(shù)據(jù),會發(fā)現(xiàn)還有一行沒有修改,其實這行是從事務(wù) T2 中添加的,就好像產(chǎn)生幻覺一樣);(讀取了前一個事務(wù)提交的數(shù)據(jù),針對一批數(shù)據(jù)整體)

                               d. 持久性:事務(wù)完成后,事務(wù)對數(shù)據(jù)庫的所有更新將被保存到數(shù)據(jù)庫,不能回滾

2、InnoDB 是 mySQL 默認(rèn)的存儲引擎,默認(rèn)的隔離級別是 RR,并且在 RR 的隔離級別下更近一步,通過多版本并發(fā)控制(MVCC)解決不可重復(fù)讀問題,加上間隙鎖(也就是并發(fā)控制)解決幻讀問題。因此 InnoDB 的 RR 隔離級別其實實現(xiàn)了串行化級別的效果,而保留了比較好的并發(fā)性能。

MySQL 數(shù)據(jù)庫為我們提供的四種隔離級別:

a、Serializable(串行化):可避免臟讀、不可重復(fù)讀、幻讀的發(fā)生;

b、Repeatable read(可重復(fù)讀):可避免臟讀、不可重復(fù)讀的發(fā)生;

c、Read committed(讀已提交):可避免臟讀的發(fā)生;

d、Read uncommitted(讀未提交):最低級別,任何情況都無法保證;

從 a —- d 隔離級別由高到低,級別越高,執(zhí)行效率越低

3、InnoDB 支持行級鎖。行級鎖可以最大程度的支持并發(fā),行級鎖是由存儲引擎層實現(xiàn)的。

鎖:鎖的主要作用是管理共享資源的并發(fā)訪問,用于實現(xiàn)事務(wù)的隔離性

類型:共享鎖(讀鎖)、獨占鎖(寫鎖 )        

       MySQL 鎖的力度:表級鎖(開銷小、并發(fā)性低),通常在服務(wù)器層實現(xiàn)

                                    行級鎖(開銷大、并發(fā)性高),只會在存儲引擎層面進(jìn)行實現(xiàn)

4、InnoDB 是為處理巨大數(shù)據(jù)量的最大性能設(shè)計。它的 CPU 效率可能是任何基于磁盤的關(guān)系型數(shù)據(jù)庫引擎所不能匹敵的

5、InnoDB 存儲引擎完全與 MySQL 服務(wù)器整合,InnoDB 存儲引擎為在主內(nèi)存中緩存數(shù)據(jù)和索引而維持它自己的緩沖池。InnoDB 將它的表和索引在一個邏輯表空間中,表空間可以包含數(shù)個文件(或原始磁盤文件);

6、InnoDB 支持外鍵完整性約束,存儲表中的數(shù)據(jù)時,每張表的存儲都按照主鍵順序存放,如果沒有顯示在表定義時指定主鍵。InnoDB 會為每一行生成一個 6 字節(jié)的 ROWID, 并以此作為主鍵

7、InnoDB 被用在眾多需要高性能的大型數(shù)據(jù)庫站點上

8、InnoDB 中不保存表的行數(shù)(eg:select count(*)from table 時,InnoDB 需要掃描一遍整個表來計算有多少行);清空整個表時,InnoDB 是一行一行的刪除,效率非常慢;

InnoDB 不創(chuàng)建目錄,使用 InnoDB 時,MySQL 將在 MySQL 數(shù)據(jù)目錄下創(chuàng)建一個名為 ibdata1 的 10MB 大小的自動擴(kuò)展數(shù)據(jù)文件,以及兩個名為 ib_logfile0 和 ib_logfile1 的 5MB 大小的日志文件

二、InnoDB 引擎的底層實現(xiàn)

InnoDB 的存儲文件有兩個,后綴名分別是 .frm 和 .idb;其中 .frm 是表的定義文件,.idb 是表的數(shù)據(jù)文件。

1、InnoDB 引擎采用 B +Tree 結(jié)構(gòu)來作為索引結(jié)構(gòu)

B-Tree(平衡多路查找樹):為磁盤等外存儲設(shè)備設(shè)計的一種平衡查找樹

系統(tǒng)從磁盤讀取數(shù)據(jù)到內(nèi)存時是以磁盤塊位基本單位的,位于同一磁盤塊中的數(shù)據(jù)會被一次性讀取出來,而不是按需讀取。

InnoDB 存儲引擎使用頁作為數(shù)據(jù)讀取單位,頁是其磁盤管理的最小單位,默認(rèn) page 大小是 16k.

系統(tǒng)的一個磁盤塊的存儲空間往往沒有那么大,因此 InnoDB 每次申請磁盤空間時都會是若干地址連續(xù)磁盤塊來達(dá)到頁的大小 16KB。

InnoDB 在把磁盤數(shù)據(jù)讀入到磁盤時會以頁為基本單位,在查詢數(shù)據(jù)時,如果一個頁中的每條數(shù)據(jù)都能助于定位數(shù)據(jù)記錄的位置,這將會減少磁盤 I / O 的次數(shù),提高查詢效率。

B-Tree 結(jié)構(gòu)的數(shù)據(jù)可以讓系統(tǒng)高效的找到數(shù)據(jù)所在的磁盤塊

B-Tree 中的每個節(jié)點根據(jù)實際情況可以包含大量的關(guān)鍵字信息和分支,例:

mysql innodb 指的是什么

每個節(jié)點占用一個盤塊的磁盤空間,一個節(jié)點上有兩個升序排序的關(guān)鍵字和三個指向子樹根節(jié)點的指針,指針存儲的是子節(jié)點所在磁盤塊的地址。

以根節(jié)點為例,關(guān)鍵字為 17 和 35,P1 指針指向的子樹的數(shù)據(jù)范圍小于 17,P2 指針指向的子樹的數(shù)據(jù)范圍為 17—-35,P3 指針指向的子樹的數(shù)據(jù)范圍大于 35;

模擬查找關(guān)鍵字 29 的過程:

a. 根據(jù)根節(jié)點找到磁盤塊 1,讀入內(nèi)存。【磁盤 I / O 操作第一次】

b. 比較關(guān)鍵字 29 在區(qū)間(17,35),找到磁盤塊 1 的指針 P2;

c. 根據(jù) P2 指針找到磁盤塊 3,讀入內(nèi)存。【磁盤 I / O 操作第二次】

d. 比較關(guān)鍵字 29 在區(qū)間(26,30),找到磁盤塊 3 的指針 P2;

e. 根據(jù) P2 指針找到磁盤塊 8,讀入內(nèi)存。【磁盤 I / O 操作第三次】

f. 在磁盤塊 8 中的關(guān)鍵字列表中找到關(guān)鍵字 29.

MySQL 的 InnoDB 存儲引擎在設(shè)計時是將根節(jié)點常駐內(nèi)存的,因此力求達(dá)到樹的深度不超過 3,也就是 I / O 不需要超過三次;

分析上面的結(jié)果,發(fā)現(xiàn)需要三次磁盤 I / O 操作,和三次內(nèi)存查找操作。由于內(nèi)存中的關(guān)鍵字是一個有序表結(jié)構(gòu),可以利用二分法查找提高效率;而三次磁盤 I / O 操作時影響整個 B -Tree 查找效率的決定因素。

B+Tree

B+Tree 是在 B -Tree 基礎(chǔ)上的一種優(yōu)化,使其更適合實現(xiàn)外存儲索引結(jié)構(gòu),B-Tree 中每個節(jié)點中有 key,也有 data,而每一頁的存儲空間是有限的,如果 data 數(shù)據(jù)較大時將會導(dǎo)致每個節(jié)點(即一個頁)能存儲的 key 的數(shù)量很小。當(dāng)存儲的數(shù)據(jù)量很大時同樣會導(dǎo)致 B -Tree 的深度較大,增大查詢時的磁盤 I / O 次數(shù),進(jìn)而影響查詢效率。

在 B +Tree 中所有數(shù)據(jù)記錄節(jié)點都是按照鍵值大小順序存放在同一層的葉子節(jié)點上,而非葉子節(jié)點上只存儲 key 值信息,這樣可以大大加大每個節(jié)點存儲的 key 值數(shù)量,降低 B +Tree 的高度;

B+Tree 在 B -Tree 的基礎(chǔ)上有兩點變化:(1)數(shù)據(jù)是存在葉子節(jié)點中的

                                                       (2)數(shù)據(jù)節(jié)點之間是有指針指向的

由于 B +Tree 的非葉子節(jié)點只存儲鍵值信息,假設(shè)每個磁盤塊能存儲 4 個鍵值及指針信息,則變成 B +Tree 后其結(jié)構(gòu)如下圖所示:

mysql innodb 指的是什么

通常在 B +Tree 上有兩個頭指針,一個指向根節(jié)點,另一個指向關(guān)鍵字最小的葉子節(jié)點,而且所有葉子節(jié)點(即數(shù)據(jù)節(jié)點)之間是一種鏈?zhǔn)江h(huán)結(jié)構(gòu)。

因此可以對 B +Tree 進(jìn)行兩種查找運(yùn)算,一種是對于主鍵的范圍查找和分頁查找,另一種是從根節(jié)點開始,進(jìn)行隨機(jī)查找。

InnoDB 中的 B +Tree

InnoDB 是以 ID 為索引的數(shù)據(jù)存儲

采用 InnoDB 引擎的數(shù)據(jù)存儲文件有兩個,一個定義文件,一個是數(shù)據(jù)文件。

InnoDB 通過 B +Tree 結(jié)構(gòu)對 ID 建索引,然后在葉子節(jié)點中存儲記錄

mysql innodb 指的是什么

若建立索引的字段不是主鍵 ID,則對該字段建索引,然后在葉子節(jié)點中存儲的是該記錄的主鍵,然后通過主鍵索引找到對應(yīng)記錄。

感謝各位的閱讀,以上就是“mysql innodb 指的是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對 mysql innodb 指的是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向 AI 問一下細(xì)節(jié)

丸趣 TV 網(wǎng) – 提供最優(yōu)質(zhì)的資源集合!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2024-02-03發(fā)表,共計4299字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 北辰区| 乐安县| 新巴尔虎右旗| 永安市| 英山县| 沙河市| 夏河县| 德格县| 三江| 浦县| 南阳市| 凤冈县| 东城区| 读书| 平定县| 高密市| 平武县| 房山区| 金昌市| 寻乌县| 尖扎县| 邓州市| 多伦县| 军事| 柘荣县| 荆门市| 吴江市| 平乐县| 名山县| 昌黎县| 上杭县| 娱乐| 东源县| 霸州市| 金乡县| 阜南县| 贵溪市| 谷城县| 古田县| 宜良县| 漳浦县|