本文主要給大家簡單講講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)
猜你還喜歡下面的內(nèi)容