1. 程式人生 > >mysql5.7——innodb存儲引擎總結

mysql5.7——innodb存儲引擎總結

mysql5.7innodb innodb innodb存儲引擎

一、innodb初探:

1、MySQL日誌文件:

①:slow.log 文件會記錄慢查詢日誌,當一條語句執行時間超過在配置參數long_query_time中指定的值時,這條語句就會被記錄在這個文件中;

②:error.log 文件會記錄一些系統啟動或運行時的錯誤或警告信息,通過配置參數log_error來設置;

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


2、MySQL系統的datadir目錄下,有一個目錄叫MySQL:

這個目錄實際上是MySQL數據庫的一些系統表,比如權限、用戶等,但這些表都是MyISAM存儲引擎的表;


3、默認的3個數據庫實例:information_schema performance_schema sys

①:information_schema :

information_schema數據庫是MySQL自帶的,它是一個信息數據庫,其中保存著關於MySQL服務器維護的所有其他數據庫的信息,如數據庫名、數據庫表、表列的數據類型及訪問權限等;在該數據庫中有數個只讀表,它們實際上是視圖,而不是基本表;


②:performance_schema:

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

提供進程等待的詳細信息,包括鎖、互斥變量、文件信息;

保存歷史事件匯總信息,為判斷MySQL服務器性能做出詳細的依據

添加或刪除監控事件點都非常不容易,並可以隨意改變MySQL服務器的監控周期;


③:sys:

sys數據庫是MySQL5.7中首次加入的系統信息庫,這個庫類似Oracle中動態視圖,通過這庫可以快速的了解系統的元數據信息,並非常方便的讓DBA發型數據庫的很多信息,在解決性能瓶頸、自動化運維方面提供了巨大的幫助。該庫在MySQL5.7中是默認的,在5.6可以手動導入;

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


4、innoDB存儲引擎包括兩個默認的日誌文件,

日誌文件大小通過參數innodb_log_file_size來設置,個數通過參數innodb_log_files_in_group來設置。這幾個日誌文件的大小被設置後在運行過程中是不能被改變的,如果要修改需要關閉數據庫然後修改;

--註意:innodb存儲引擎還有一個小文件,db.opt 這個文件存儲的是MySQL數據庫的一些配置信息,例如編碼,排序的信息,如果在創建數據庫時指定一些非默認的參數的話就會在這個文件中存儲這些信息;


二、innodb數據字典:

1、在MySQL中是看不到數據字典的,原因就是MySQL是一個插件式的數據庫管理系統,它的結構分兩層,分別是server層和存儲引擎層,這兩層需要相互配合才能一起友好的工作,但是作為一個插件式的數據庫管理系統,存儲引擎層可以有多個存儲引擎的插件,但server層只有一個;最早的默認存儲引擎為MyISAM,它是沒有數據字典的,關於表結構,它所擁有的只有.frm文件,所以這導致了innodb也必須要有這個文件才能使得server層識別並管理它;


2、innodb有4個最基本的系統表,

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

①:sys_tables表:用來存儲所有以innodb為存儲引擎的表,每條記錄對應已經定義的一個表;

name:表示一個表名

ID:表的ID號

N_COLSL :表示這個表的列的個數,建表指定的列數(4個字節)

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

space:表示這個表所在的表空間ID號;

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


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

table_id :表示這個列所屬的表的ID號;

pos :表示這個列在表中是第幾列;

name :表示這個列的列名

mtype :表示這個列的主數據類型;

prtype :表示這個列的一些精確數據類型,它是一個組合值,包括null標誌,是否有符號數的標誌,是否是二進制字符串的標誌及表示這個列是真的varchar;

len :表示這個列的數據長度,但不包括varchar類型,因為這個類型在記錄裏面存儲了數據長度

prec :表示這個列數據的精度,但目前好像沒有使用;


③:sys_indexes:用來存儲innodb中所有表的索引信息,每條記錄對應一個索引;

table_id :表示這個索引所屬的表的ID號

ID :表示這個索引的索引ID號

name :表示這個索引的索引名;

n_fields :表示這個索引包含的列個數;

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

space :表示這個索引數據所在表空間ID號;

page_no :表示這個索引對應的B+樹的根頁面;


④:sys_fields :用來存儲所有索引中定義的索引列,每一條記錄對應一個索引列

index_id :這個列所在的索引

pos :這個列在某個索引中是第幾個索引列;

col_name :這個索引列的列名;

3、字典表加載:

在innodb啟動的時候,如果是新建數據庫,則需要初始化庫,所以首先需要做的就是創建字典管理的B+樹等信息,在這些初始化操作之後,就通過函數dict_boot加載常駐內存的四個系統表並讀取一些其他信息;


4、rowid管理:

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


三、innodb數據存儲結構

1、表空間文件組成結構

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

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

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

2、段:

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


3、簇:

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

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


4、頁面:

“頁面”是簇細分之後的產物,它是簇的組成單位,也是段所管理的最小單位、數據文件管理的最小單位,當然也是文件中空間分配的最小單位。

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

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


5、段、簇、頁面組織結構:

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


---註意:

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

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

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


本文出自 “笨小孩的dba之路” 博客,請務必保留此出處http://fengfeng688.blog.51cto.com/4896812/1954429

mysql5.7——innodb存儲引擎總結