總結(jié)mysql5.7中innodb存儲(chǔ)引擎的一些知識(shí)-創(chuàng)新互聯(lián)

本文主要給大家簡(jiǎn)單講講mysql5.7中innodb存儲(chǔ)引擎的一些知識(shí),相關(guān)專(zhuān)業(yè)術(shù)語(yǔ)大家可以上網(wǎng)查查或者找一些相關(guān)書(shū)籍補(bǔ)充一下,這里就不涉獵了,我們就直奔主題吧,希望mysql5.7中innodb存儲(chǔ)引擎的一些知識(shí)這篇文章可以給大家?guī)?lái)一些實(shí)際幫助。

成都創(chuàng)新互聯(lián)長(zhǎng)期為上千多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為淄川企業(yè)提供專(zhuān)業(yè)的成都網(wǎng)站建設(shè)、做網(wǎng)站,淄川網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

一、innodb初探:

1、MySQL日志文件:

①:slow.log 文件會(huì)記錄慢查詢?nèi)罩?,?dāng)一條語(yǔ)句執(zhí)行時(shí)間超過(guò)在配置參數(shù)long_query_time中指定的值時(shí),這條語(yǔ)句就會(huì)被記錄在這個(gè)文件中;

②:error.log 文件會(huì)記錄一些系統(tǒng)啟動(dòng)或運(yùn)行時(shí)的錯(cuò)誤或警告信息,通過(guò)配置參數(shù)log_error來(lái)設(shè)置;

③:general.log 文件會(huì)記錄所有在數(shù)據(jù)庫(kù)上執(zhí)行的語(yǔ)句,經(jīng)常用來(lái)追蹤問(wèn)題,但會(huì)影響一點(diǎn)性能,所以一般不會(huì)打開(kāi),只有在調(diào)試的時(shí)候會(huì)偶爾開(kāi)啟。(如果在QPS很高的情況下,這個(gè)文件可能會(huì)非常大不太好處理一般不建議打開(kāi))

2、MySQL系統(tǒng)的datadir目錄下,有一個(gè)目錄叫MySQL:

 這個(gè)目錄實(shí)際上是MySQL數(shù)據(jù)庫(kù)的一些系統(tǒng)表,比如權(quán)限、用戶等,但這些表都是MyISAM存儲(chǔ)引擎的表;

3、默認(rèn)的3個(gè)數(shù)據(jù)庫(kù)實(shí)例:information_schema  performance_schema  sys

①:information_schema :

 information_schema數(shù)據(jù)庫(kù)是MySQL自帶的,它是一個(gè)信息數(shù)據(jù)庫(kù),其中保存著關(guān)于MySQL云服務(wù)器維護(hù)的所有其他數(shù)據(jù)庫(kù)的信息,如數(shù)據(jù)庫(kù)名、數(shù)據(jù)庫(kù)表、表列的數(shù)據(jù)類(lèi)型及訪問(wèn)權(quán)限等;在該數(shù)據(jù)庫(kù)中有數(shù)個(gè)只讀表,它們實(shí)際上是視圖,而不是基本表;

②:performance_schema:

 performance_schema數(shù)據(jù)庫(kù)是在MySQL5.5新增的,命名為performance_schema,該數(shù)據(jù)庫(kù)它是針對(duì)性能的,主要用于收集數(shù)據(jù)庫(kù)云服務(wù)器性能參數(shù)。該數(shù)據(jù)庫(kù)有如下功能:

 提供進(jìn)程等待的詳細(xì)信息,包括鎖、互斥變量、文件信息;

 保存歷史事件匯總信息,為判斷MySQL云服務(wù)器性能做出詳細(xì)的依據(jù)

 添加或刪除監(jiān)控事件點(diǎn)都非常不容易,并可以隨意改變MySQL云服務(wù)器的監(jiān)控周期;

③:sys:

 sys數(shù)據(jù)庫(kù)是MySQL5.7中首次加入的系統(tǒng)信息庫(kù),這個(gè)庫(kù)類(lèi)似Oracle中動(dòng)態(tài)視圖,通過(guò)這庫(kù)可以快速的了解系統(tǒng)的元數(shù)據(jù)信息,并非常方便的讓DBA發(fā)型數(shù)據(jù)庫(kù)的很多信息,在解決性能瓶頸、自動(dòng)化運(yùn)維方面提供了巨大的幫助。該庫(kù)在MySQL5.7中是默認(rèn)的,在5.6可以手動(dòng)導(dǎo)入;

注意:這個(gè)庫(kù)是通過(guò)視圖的形式把information_schema和performance_schema結(jié)合起來(lái)的,查詢出讓人更加容易理解的結(jié)果;但是前提是,sys庫(kù)本身的信息來(lái)源要依賴information_schema;

4、innoDB存儲(chǔ)引擎包括兩個(gè)默認(rèn)的日志文件,

  日志文件大小通過(guò)參數(shù)innodb_log_file_size來(lái)設(shè)置,個(gè)數(shù)通過(guò)參數(shù)innodb_log_files_in_group來(lái)設(shè)置。這幾個(gè)日志文件的大小被設(shè)置后在運(yùn)行過(guò)程中是不能被改變的,如果要修改需要關(guān)閉數(shù)據(jù)庫(kù)然后修改;

--注意:innodb存儲(chǔ)引擎還有一個(gè)小文件,db.opt 這個(gè)文件存儲(chǔ)的是MySQL數(shù)據(jù)庫(kù)的一些配置信息,例如編碼,排序的信息,如果在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)指定一些非默認(rèn)的參數(shù)的話就會(huì)在這個(gè)文件中存儲(chǔ)這些信息;

二、innodb數(shù)據(jù)字典:

1、在MySQL中是看不到數(shù)據(jù)字典的,原因就是MySQL是一個(gè)插件式的數(shù)據(jù)庫(kù)管理系統(tǒng),它的結(jié)構(gòu)分兩層,分別是server層和存儲(chǔ)引擎層,這兩層需要相互配合才能一起友好的工作,但是作為一個(gè)插件式的數(shù)據(jù)庫(kù)管理系統(tǒng),存儲(chǔ)引擎層可以有多個(gè)存儲(chǔ)引擎的插件,但server層只有一個(gè);最早的默認(rèn)存儲(chǔ)引擎為MyISAM,它是沒(méi)有數(shù)據(jù)字典的,關(guān)于表結(jié)構(gòu),它所擁有的只有.frm文件,所以這導(dǎo)致了innodb也必須要有這個(gè)文件才能使得server層識(shí)別并管理它;

2、innodb有4個(gè)最基本的系統(tǒng)表,

 用來(lái)存儲(chǔ)用戶定義的表、列、索引及索引列等信息,這些表分別為:sys_tables  sys_columns  sys_indexes  sys_fields

①:sys_tables表:用來(lái)存儲(chǔ)所有以innodb為存儲(chǔ)引擎的表,每條記錄對(duì)應(yīng)已經(jīng)定義的一個(gè)表;

 name:表示一個(gè)表名

 ID:表的ID號(hào)

 N_COLSL :表示這個(gè)表的列的個(gè)數(shù),建表指定的列數(shù)(4個(gè)字節(jié))

 type:表示這個(gè)表的存儲(chǔ)類(lèi)型,包括記錄的格式、壓縮等信息(4個(gè)字節(jié))

 space:表示這個(gè)表所在的表空間ID號(hào);

 (其中,mix_id  mix_len  cluster_name這三個(gè)位置暫時(shí)使用不到)

②:sys_columns:用來(lái)存儲(chǔ)innodb中定義的所有表中所有列的信息,每一列對(duì)應(yīng)這個(gè)表中的一條記錄;

 table_id :表示這個(gè)列所屬的表的ID號(hào);

 pos :表示這個(gè)列在表中是第幾列;

 name :表示這個(gè)列的列名

 mtype :表示這個(gè)列的主數(shù)據(jù)類(lèi)型;

 prtype :表示這個(gè)列的一些精確數(shù)據(jù)類(lèi)型,它是一個(gè)組合值,包括null標(biāo)志,是否有符號(hào)數(shù)的標(biāo)志,是否是二進(jìn)制字符串的標(biāo)志及表示這個(gè)列是真的varchar;

 len :表示這個(gè)列的數(shù)據(jù)長(zhǎng)度,但不包括varchar類(lèi)型,因?yàn)檫@個(gè)類(lèi)型在記錄里面存儲(chǔ)了數(shù)據(jù)長(zhǎng)度

 prec :表示這個(gè)列數(shù)據(jù)的精度,但目前好像沒(méi)有使用;

③:sys_indexes:用來(lái)存儲(chǔ)innodb中所有表的索引信息,每條記錄對(duì)應(yīng)一個(gè)索引;

 table_id :表示這個(gè)索引所屬的表的ID號(hào)

 ID :表示這個(gè)索引的索引ID號(hào)

 name :表示這個(gè)索引的索引名;

 n_fields :表示這個(gè)索引包含的列個(gè)數(shù);

 type :表示這個(gè)索引的類(lèi)型,包括聚簇索引、唯一索引、等

 space :表示這個(gè)索引數(shù)據(jù)所在表空間ID號(hào);

 page_no :表示這個(gè)索引對(duì)應(yīng)的B+樹(shù)的根頁(yè)面;

④:sys_fields :用來(lái)存儲(chǔ)所有索引中定義的索引列,每一條記錄對(duì)應(yīng)一個(gè)索引列

 index_id :這個(gè)列所在的索引

 pos :這個(gè)列在某個(gè)索引中是第幾個(gè)索引列;

 col_name :這個(gè)索引列的列名;

3、字典表加載:

 在innodb啟動(dòng)的時(shí)候,如果是新建數(shù)據(jù)庫(kù),則需要初始化庫(kù),所以首先需要做的就是創(chuàng)建字典管理的B+樹(shù)等信息,在這些初始化操作之后,就通過(guò)函數(shù)dict_boot加載常駐內(nèi)存的四個(gè)系統(tǒng)表并讀取一些其他信息;

4、rowid管理:

 在innodb中,用戶表中的記錄不一定都會(huì)有一個(gè)rowid列,rowid只有在一個(gè)表沒(méi)有定義主鍵時(shí),也就是需要rowid作為聚簇索引列的時(shí)候才會(huì)被分配給這個(gè)表。而rowid的管理分配,并不是一個(gè)表獨(dú)享一個(gè)ID空間,而是全局的,所有表都共享這個(gè)ID號(hào);

三、innodb數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)

1、表空間文件組成結(jié)構(gòu)

 innodb存儲(chǔ)引擎在存儲(chǔ)設(shè)計(jì)上模仿了Oracle的存儲(chǔ)結(jié)構(gòu),其數(shù)據(jù)是按照表空間進(jìn)行管理的。新建一個(gè)數(shù)據(jù)庫(kù)時(shí),innodb存儲(chǔ)引擎會(huì)初始化一個(gè)名為ibdata1 的表空間文件,默認(rèn)情況下,這個(gè)文件會(huì)存儲(chǔ)所有表的數(shù)據(jù),以及我們所熟知但看不到的系統(tǒng)表sys_tables、sys_columns、sys_indexes 、sys_fields等。此外,還會(huì)存儲(chǔ)用來(lái)保證數(shù)據(jù)完整性的回滾段數(shù)據(jù),當(dāng)然這部分?jǐn)?shù)據(jù)在新版本的MySQL中,已經(jīng)可以通過(guò)參數(shù)來(lái)設(shè)置回滾段的存儲(chǔ)位置了;

 innodb存儲(chǔ)引擎的設(shè)計(jì)很靈活,可以通過(guò)參數(shù)innodb_file_per_table來(lái)設(shè)置,使得每一個(gè)表都對(duì)應(yīng)一個(gè)自己的獨(dú)立表空間文件,而不是存儲(chǔ)到公共的ibdata1文件中。獨(dú)立的表空間文件之存儲(chǔ)對(duì)應(yīng)表的B+樹(shù)數(shù)據(jù)、索引和插入緩沖等信息,其余信息還是存儲(chǔ)在默認(rèn)表空間中。

 這個(gè)文件所存儲(chǔ)的內(nèi)容主要就是B+樹(shù)(索引),一個(gè)表可以有多個(gè)索引,也就是在一個(gè)文件中,可以存儲(chǔ)多個(gè)索引,而如果一個(gè)表沒(méi)有索引的話,用來(lái)存儲(chǔ)數(shù)據(jù)的被稱(chēng)為聚簇索引,也就是說(shuō)這也是一個(gè)索引。最終的結(jié)論是,ibd文件存儲(chǔ)的就是一個(gè)表的所有索引數(shù)據(jù);

2、段:

 段是表空間文件中的主要組織結(jié)構(gòu),它是一個(gè)邏輯概念,用來(lái)管理物理文件,是構(gòu)成索引、表、回滾段的基本元素。創(chuàng)建一個(gè)索引(B+樹(shù))時(shí)會(huì)同時(shí)創(chuàng)建兩個(gè)段,分別是內(nèi)節(jié)點(diǎn)段和葉子段,內(nèi)節(jié)點(diǎn)段用來(lái)管理(存儲(chǔ))B+樹(shù)非葉子(頁(yè)面)的數(shù)據(jù),葉子段用來(lái)管理(存儲(chǔ))B+樹(shù)葉子節(jié)點(diǎn)的數(shù)據(jù);也就是說(shuō),在索引數(shù)據(jù)量一直增長(zhǎng)的過(guò)程中,所有新的存儲(chǔ)空間的申請(qǐng),都是從“段”這個(gè)概念中申請(qǐng)的。一個(gè)索引,包括兩個(gè)段,那么一個(gè)表的段的數(shù)目就是索引的個(gè)數(shù)乘以2了。(更形象的解釋?zhuān)篿bd文件,就是由多個(gè)段組成的,沒(méi)有任何其他空間是脫離了段的管理。)

3、簇:

 innodb引入了簇的概念,在代碼中被稱(chēng)為extent;

 簇是構(gòu)成段的基本元素,一個(gè)段由若干個(gè)簇構(gòu)成。一個(gè)簇是物理上連續(xù)分配的一個(gè)段空間,每一個(gè)段至少會(huì)有一個(gè)簇,在創(chuàng)建一個(gè)段時(shí)會(huì)創(chuàng)建一個(gè)默認(rèn)的簇。如果存儲(chǔ)數(shù)據(jù)時(shí),一個(gè)簇已經(jīng)不足以放下更多的數(shù)據(jù),此時(shí)需要從這個(gè)段中分配一個(gè)新的簇來(lái)存放新的數(shù)據(jù)。一個(gè)段所管理的空間大小是無(wú)限的,可以一直擴(kuò)展下去,但是擴(kuò)展的最小單位就是簇。簇的空間大小是固定的,一般是64個(gè)頁(yè)面;(簇是實(shí)際的物理存儲(chǔ)空間)

4、頁(yè)面:

 “頁(yè)面”是簇細(xì)分之后的產(chǎn)物,它是簇的組成單位,也是段所管理的最小單位、數(shù)據(jù)文件管理的最小單位,當(dāng)然也是文件中空間分配的最小單位。

 一個(gè)簇中可以包括多個(gè)頁(yè)面(默認(rèn)為64個(gè)頁(yè)面,每個(gè)頁(yè)面是16KB),這個(gè)頁(yè)面數(shù)通常被叫做“簇的大小”。這些頁(yè)面都?xì)w這個(gè)簇管理,在邏輯上(頁(yè)面號(hào)都是從小到大連續(xù)的)及物理上都是連續(xù)的。在向表中插入數(shù)據(jù)時(shí),如果一個(gè)頁(yè)面已經(jīng)被寫(xiě)完,系統(tǒng)會(huì)從當(dāng)前簇中分配一個(gè)新的空閑頁(yè)面處理使用,如果當(dāng)前簇中的64個(gè)頁(yè)面都被分配完,系統(tǒng)會(huì)從當(dāng)前頁(yè)面所在段中分配一個(gè)新的簇,然后再?gòu)倪@個(gè)簇中分配一個(gè)新的頁(yè)面來(lái)使用;(更簡(jiǎn)單的說(shuō):表空間文件就是被劃分成相等長(zhǎng)度的塊,每一個(gè)塊就是一個(gè)頁(yè)面,一個(gè)頁(yè)面默認(rèn)為16KB,一個(gè)文件中沒(méi)有任何空間是脫離了段的管理而存在的)

---注意:沒(méi)有任何空間不是一頁(yè)面的形式而存在的。

5、段、簇、頁(yè)面組織結(jié)構(gòu):

 一個(gè)表空間可以有多個(gè)文件,每個(gè)文件都有各自的編號(hào),創(chuàng)建一個(gè)表空間時(shí),至少有一個(gè)文件,這個(gè)文件被稱(chēng)為“0號(hào)文件”。一個(gè)文件是被切割為等長(zhǎng)“默認(rèn)16KB”的塊,這個(gè)塊通常被稱(chēng)為頁(yè)面,那么在“0號(hào)文件”的第一個(gè)頁(yè)面(page_no為0)中,存儲(chǔ)了這個(gè)表空間中所有段簇也管理的入口,那么在這個(gè)頁(yè)面存儲(chǔ)的數(shù)據(jù)就是16KB,但通常會(huì)有頁(yè)面頭信息會(huì)占用一些空間,真正的管理信息數(shù)據(jù)是從頁(yè)面偏移為fil_page_data(38)的位置開(kāi)始的,這個(gè)位置存儲(chǔ)了表空間的描述信息;

---注意:

①:表空間控制信息有:滿簇鏈表、半滿簇鏈表、空閑簇鏈表,而段的inode信息中也有這些信息;表空間中的鏈表管理的是整個(gè)表空間中所有的簇,包括滿   簇、半滿簇及空閑簇,而段的iNode信息中管理的是屬于自己段中的滿簇、半滿簇及空閑簇。

②:在innodb中,一個(gè)簇描述頁(yè)面要管理16384個(gè)頁(yè)面,簇大小默認(rèn)為(fsp_extent_size)64個(gè),而簇描述符的大小為40B,所以一個(gè)簇描述頁(yè)面中可以描述    的簇的個(gè)數(shù)為(univ_page_size-頁(yè)面頭長(zhǎng)度)/40,其中univ_page_size=16384B表示頁(yè)面大小;在一個(gè)表空間中,簇描述頁(yè)面的存儲(chǔ)是每隔16384個(gè)頁(yè)    面就有一個(gè)簇描述頁(yè)面,所以簇描述頁(yè)面中只需要描述16384個(gè)頁(yè)面即可;

③:所謂的btr,在innodb中,表示的就是B+樹(shù)的處理,不管以它為開(kāi)頭的是函數(shù),還是文件,都是相關(guān)的處理,是Btree的簡(jiǎn)稱(chēng);

mysql5.7中innodb存儲(chǔ)引擎的一些知識(shí)就先給大家講到這里,對(duì)于其它相關(guān)問(wèn)題大家想要了解的可以持續(xù)關(guān)注我們的行業(yè)資訊。我們的板塊內(nèi)容每天都會(huì)捕捉一些行業(yè)新聞及專(zhuān)業(yè)知識(shí)分享給大家的。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

分享題目:總結(jié)mysql5.7中innodb存儲(chǔ)引擎的一些知識(shí)-創(chuàng)新互聯(lián)
文章路徑:http://bm7419.com/article4/cedpie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、網(wǎng)站設(shè)計(jì)企業(yè)建站、小程序開(kāi)發(fā)、網(wǎng)站營(yíng)銷(xiāo)、軟件開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司