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

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

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

一、innodb初探:

1、MySQL日志文件:

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

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

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

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

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

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

①:information_schema :

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

②:performance_schema:

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

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

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

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

③:sys:

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

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

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

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

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

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

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

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

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

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

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

 ID:表的ID號

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3、字典表加載:

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

4、rowid管理:

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

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

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

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

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

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

2、段:

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

3、簇:

 innodb引入了簇的概念,在代碼中被稱為extent;

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

4、頁面:

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

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

---注意:沒有任何空間不是一頁面的形式而存在的。

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

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

---注意:

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

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

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

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

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

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

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

廣告

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

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