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

一、innodb初探:
1、MySQL日志文件:
①:slow.log 文件會記錄慢查詢日志,當一條語句執(zhí)行時間超過在配置參數(shù)long_query_time中指定的值時,這條語句就會被記錄在這個文件中;
②:error.log 文件會記錄一些系統(tǒng)啟動或運行時的錯誤或警告信息,通過配置參數(shù)log_error來設置;
③:general.log 文件會記錄所有在數(shù)據(jù)庫上執(zhí)行的語句,經常用來追蹤問題,但會影響一點性能,所以一般不會打開,只有在調試的時候會偶爾開啟。(如果在QPS很高的情況下,這個文件可能會非常大不太好處理一般不建議打開)
2、MySQL系統(tǒng)的datadir目錄下,有一個目錄叫MySQL:
這個目錄實際上是MySQL數(shù)據(jù)庫的一些系統(tǒng)表,比如權限、用戶等,但這些表都是MyISAM存儲引擎的表;
3、默認的3個數(shù)據(jù)庫實例:information_schema performance_schema sys
①:information_schema :
information_schema數(shù)據(jù)庫是MySQL自帶的,它是一個信息數(shù)據(jù)庫,其中保存著關于MySQL云服務器維護的所有其他數(shù)據(jù)庫的信息,如數(shù)據(jù)庫名、數(shù)據(jù)庫表、表列的數(shù)據(jù)類型及訪問權限等;在該數(shù)據(jù)庫中有數(shù)個只讀表,它們實際上是視圖,而不是基本表;
②:performance_schema:
performance_schema數(shù)據(jù)庫是在MySQL5.5新增的,命名為performance_schema,該數(shù)據(jù)庫它是針對性能的,主要用于收集數(shù)據(jù)庫云服務器性能參數(shù)。該數(shù)據(jù)庫有如下功能:
提供進程等待的詳細信息,包括鎖、互斥變量、文件信息;
保存歷史事件匯總信息,為判斷MySQL云服務器性能做出詳細的依據(jù)
添加或刪除監(jiān)控事件點都非常不容易,并可以隨意改變MySQL云服務器的監(jiān)控周期;
③:sys:
sys數(shù)據(jù)庫是MySQL5.7中首次加入的系統(tǒng)信息庫,這個庫類似Oracle中動態(tài)視圖,通過這庫可以快速的了解系統(tǒng)的元數(shù)據(jù)信息,并非常方便的讓DBA發(fā)型數(shù)據(jù)庫的很多信息,在解決性能瓶頸、自動化運維方面提供了巨大的幫助。該庫在MySQL5.7中是默認的,在5.6可以手動導入;
注意:這個庫是通過視圖的形式把information_schema和performance_schema結合起來的,查詢出讓人更加容易理解的結果;但是前提是,sys庫本身的信息來源要依賴information_schema;
4、innoDB存儲引擎包括兩個默認的日志文件,
日志文件大小通過參數(shù)innodb_log_file_size來設置,個數(shù)通過參數(shù)innodb_log_files_in_group來設置。這幾個日志文件的大小被設置后在運行過程中是不能被改變的,如果要修改需要關閉數(shù)據(jù)庫然后修改;
--注意:innodb存儲引擎還有一個小文件,db.opt 這個文件存儲的是MySQL數(shù)據(jù)庫的一些配置信息,例如編碼,排序的信息,如果在創(chuàng)建數(shù)據(jù)庫時指定一些非默認的參數(shù)的話就會在這個文件中存儲這些信息;
二、innodb數(shù)據(jù)字典:
1、在MySQL中是看不到數(shù)據(jù)字典的,原因就是MySQL是一個插件式的數(shù)據(jù)庫管理系統(tǒng),它的結構分兩層,分別是server層和存儲引擎層,這兩層需要相互配合才能一起友好的工作,但是作為一個插件式的數(shù)據(jù)庫管理系統(tǒng),存儲引擎層可以有多個存儲引擎的插件,但server層只有一個;最早的默認存儲引擎為MyISAM,它是沒有數(shù)據(jù)字典的,關于表結構,它所擁有的只有.frm文件,所以這導致了innodb也必須要有這個文件才能使得server層識別并管理它;
2、innodb有4個最基本的系統(tǒng)表,
用來存儲用戶定義的表、列、索引及索引列等信息,這些表分別為:sys_tables sys_columns sys_indexes sys_fields
①:sys_tables表:用來存儲所有以innodb為存儲引擎的表,每條記錄對應已經定義的一個表;
name:表示一個表名
ID:表的ID號
N_COLSL :表示這個表的列的個數(shù),建表指定的列數(shù)(4個字節(jié))
type:表示這個表的存儲類型,包括記錄的格式、壓縮等信息(4個字節(jié))
space:表示這個表所在的表空間ID號;
(其中,mix_id mix_len cluster_name這三個位置暫時使用不到)
②:sys_columns:用來存儲innodb中定義的所有表中所有列的信息,每一列對應這個表中的一條記錄;
table_id :表示這個列所屬的表的ID號;
pos :表示這個列在表中是第幾列;
name :表示這個列的列名
mtype :表示這個列的主數(shù)據(jù)類型;
prtype :表示這個列的一些精確數(shù)據(jù)類型,它是一個組合值,包括null標志,是否有符號數(shù)的標志,是否是二進制字符串的標志及表示這個列是真的varchar;
len :表示這個列的數(shù)據(jù)長度,但不包括varchar類型,因為這個類型在記錄里面存儲了數(shù)據(jù)長度
prec :表示這個列數(shù)據(jù)的精度,但目前好像沒有使用;
③:sys_indexes:用來存儲innodb中所有表的索引信息,每條記錄對應一個索引;
table_id :表示這個索引所屬的表的ID號
ID :表示這個索引的索引ID號
name :表示這個索引的索引名;
n_fields :表示這個索引包含的列個數(shù);
type :表示這個索引的類型,包括聚簇索引、唯一索引、等
space :表示這個索引數(shù)據(jù)所在表空間ID號;
page_no :表示這個索引對應的B+樹的根頁面;
④:sys_fields :用來存儲所有索引中定義的索引列,每一條記錄對應一個索引列
index_id :這個列所在的索引
pos :這個列在某個索引中是第幾個索引列;
col_name :這個索引列的列名;
3、字典表加載:
在innodb啟動的時候,如果是新建數(shù)據(jù)庫,則需要初始化庫,所以首先需要做的就是創(chuàng)建字典管理的B+樹等信息,在這些初始化操作之后,就通過函數(shù)dict_boot加載常駐內存的四個系統(tǒng)表并讀取一些其他信息;
4、rowid管理:
在innodb中,用戶表中的記錄不一定都會有一個rowid列,rowid只有在一個表沒有定義主鍵時,也就是需要rowid作為聚簇索引列的時候才會被分配給這個表。而rowid的管理分配,并不是一個表獨享一個ID空間,而是全局的,所有表都共享這個ID號;
三、innodb數(shù)據(jù)存儲結構
1、表空間文件組成結構
innodb存儲引擎在存儲設計上模仿了Oracle的存儲結構,其數(shù)據(jù)是按照表空間進行管理的。新建一個數(shù)據(jù)庫時,innodb存儲引擎會初始化一個名為ibdata1 的表空間文件,默認情況下,這個文件會存儲所有表的數(shù)據(jù),以及我們所熟知但看不到的系統(tǒng)表sys_tables、sys_columns、sys_indexes 、sys_fields等。此外,還會存儲用來保證數(shù)據(jù)完整性的回滾段數(shù)據(jù),當然這部分數(shù)據(jù)在新版本的MySQL中,已經可以通過參數(shù)來設置回滾段的存儲位置了;
innodb存儲引擎的設計很靈活,可以通過參數(shù)innodb_file_per_table來設置,使得每一個表都對應一個自己的獨立表空間文件,而不是存儲到公共的ibdata1文件中。獨立的表空間文件之存儲對應表的B+樹數(shù)據(jù)、索引和插入緩沖等信息,其余信息還是存儲在默認表空間中。
這個文件所存儲的內容主要就是B+樹(索引),一個表可以有多個索引,也就是在一個文件中,可以存儲多個索引,而如果一個表沒有索引的話,用來存儲數(shù)據(jù)的被稱為聚簇索引,也就是說這也是一個索引。最終的結論是,ibd文件存儲的就是一個表的所有索引數(shù)據(jù);
2、段:
段是表空間文件中的主要組織結構,它是一個邏輯概念,用來管理物理文件,是構成索引、表、回滾段的基本元素。創(chuàng)建一個索引(B+樹)時會同時創(chuàng)建兩個段,分別是內節(jié)點段和葉子段,內節(jié)點段用來管理(存儲)B+樹非葉子(頁面)的數(shù)據(jù),葉子段用來管理(存儲)B+樹葉子節(jié)點的數(shù)據(jù);也就是說,在索引數(shù)據(jù)量一直增長的過程中,所有新的存儲空間的申請,都是從“段”這個概念中申請的。一個索引,包括兩個段,那么一個表的段的數(shù)目就是索引的個數(shù)乘以2了。(更形象的解釋:ibd文件,就是由多個段組成的,沒有任何其他空間是脫離了段的管理。)
3、簇:
innodb引入了簇的概念,在代碼中被稱為extent;
簇是構成段的基本元素,一個段由若干個簇構成。一個簇是物理上連續(xù)分配的一個段空間,每一個段至少會有一個簇,在創(chuàng)建一個段時會創(chuàng)建一個默認的簇。如果存儲數(shù)據(jù)時,一個簇已經不足以放下更多的數(shù)據(jù),此時需要從這個段中分配一個新的簇來存放新的數(shù)據(jù)。一個段所管理的空間大小是無限的,可以一直擴展下去,但是擴展的最小單位就是簇。簇的空間大小是固定的,一般是64個頁面;(簇是實際的物理存儲空間)
4、頁面:
“頁面”是簇細分之后的產物,它是簇的組成單位,也是段所管理的最小單位、數(shù)據(jù)文件管理的最小單位,當然也是文件中空間分配的最小單位。
一個簇中可以包括多個頁面(默認為64個頁面,每個頁面是16KB),這個頁面數(shù)通常被叫做“簇的大小”。這些頁面都歸這個簇管理,在邏輯上(頁面號都是從小到大連續(xù)的)及物理上都是連續(xù)的。在向表中插入數(shù)據(jù)時,如果一個頁面已經被寫完,系統(tǒng)會從當前簇中分配一個新的空閑頁面處理使用,如果當前簇中的64個頁面都被分配完,系統(tǒng)會從當前頁面所在段中分配一個新的簇,然后再從這個簇中分配一個新的頁面來使用;(更簡單的說:表空間文件就是被劃分成相等長度的塊,每一個塊就是一個頁面,一個頁面默認為16KB,一個文件中沒有任何空間是脫離了段的管理而存在的)
---注意:沒有任何空間不是一頁面的形式而存在的。
5、段、簇、頁面組織結構:
一個表空間可以有多個文件,每個文件都有各自的編號,創(chuàng)建一個表空間時,至少有一個文件,這個文件被稱為“0號文件”。一個文件是被切割為等長“默認16KB”的塊,這個塊通常被稱為頁面,那么在“0號文件”的第一個頁面(page_no為0)中,存儲了這個表空間中所有段簇也管理的入口,那么在這個頁面存儲的數(shù)據(jù)就是16KB,但通常會有頁面頭信息會占用一些空間,真正的管理信息數(shù)據(jù)是從頁面偏移為fil_page_data(38)的位置開始的,這個位置存儲了表空間的描述信息;
---注意:
①:表空間控制信息有:滿簇鏈表、半滿簇鏈表、空閑簇鏈表,而段的inode信息中也有這些信息;表空間中的鏈表管理的是整個表空間中所有的簇,包括滿 簇、半滿簇及空閑簇,而段的iNode信息中管理的是屬于自己段中的滿簇、半滿簇及空閑簇。
②:在innodb中,一個簇描述頁面要管理16384個頁面,簇大小默認為(fsp_extent_size)64個,而簇描述符的大小為40B,所以一個簇描述頁面中可以描述 的簇的個數(shù)為(univ_page_size-頁面頭長度)/40,其中univ_page_size=16384B表示頁面大小;在一個表空間中,簇描述頁面的存儲是每隔16384個頁 面就有一個簇描述頁面,所以簇描述頁面中只需要描述16384個頁面即可;
③:所謂的btr,在innodb中,表示的就是B+樹的處理,不管以它為開頭的是函數(shù),還是文件,都是相關的處理,是Btree的簡稱;
mysql5.7中innodb存儲引擎的一些知識就先給大家講到這里,對于其它相關問題大家想要了解的可以持續(xù)關注我們的行業(yè)資訊。我們的板塊內容每天都會捕捉一些行業(yè)新聞及專業(yè)知識分享給大家的。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
分享題目:總結mysql5.7中innodb存儲引擎的一些知識-創(chuàng)新互聯(lián)
文章路徑:http://chinadenli.net/article4/cedpie.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站內鏈、網站設計、企業(yè)建站、小程序開發(fā)、網站營銷、軟件開發(fā)
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內容