1. 程式人生 > >數據庫 之 Mysql存儲引擎介紹

數據庫 之 Mysql存儲引擎介紹

name 啟用 isa action lac 會有 社區 並發 不一定

1 存儲引擎概念介紹

存儲引擎其實就是如何實現存儲數據,如何為存儲的數據建立索引以及如何更新,查詢數據等技術實現的方法。數據庫中的存儲引擎其實是對使用了該引擎的表進行某種設置,數據庫中的表設定了什麽存儲引擎,那麽該表在數據存儲方式、數據更新方式、數據查詢性能以及是否支持索引等方面就會有不同的“效果”。

通過選擇不同的存儲引擎,獲得額外的速度或者功能,從而改善服務器的應用的整體功能。例如,如果你在研究大量的臨時數據,你也許需要使用內存MySQL存儲引擎。內存存儲引擎能夠在內存中存儲所有的表格數據。又或者,你也許需要一個支持事務處理的數據庫(以確保事務處理不成功時數據的回退能力)。這些不同的技術以及配套的相關功能在 MySQL中被稱作存儲引擎(也稱作表類型)。 MySQL默認配置了許多不同的存儲引擎,可以預先設置或者在MySQL服務器中啟用。你可以選擇適用於服務器、數據庫和表格的存儲引擎,以便在選擇如何存儲你的信息、如何檢索這些信息以及你需要你的數據結合什麽性能和功能的時候為你提供最大的靈活性。

2 Mysql概念介紹

插件式存儲引擎是MySql數據庫最重要的特性之一,用戶可以根據應用的需要選擇如何存儲和索引數據、是否使用事務等。

MySQL中的數據用各種不同的技術存儲在文件(或內存)中,這些技術中的每一種技術都使用不同的存儲機制,索引技巧,鎖定水平並且最終提供廣泛的不同功能和能力。在MySQL中將這些不同的技術及配套的相關功能稱為存儲引擎。

用命令SHOW ENGINES可以查看mysql中支持的存儲引擎。MySql5.0支持的存儲引擎包括MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CVS、BLACKHOLE、FEDERATED等,其中只有InnoDB和BDB提供事務安全表,其他存儲引擎都是非事務安全表。

創建新表時如果不指定存儲引擎,系統將使用默認的存儲引擎,MySql5.5之前默認的存儲引擎是MyISAM,5.5之後改為了InnoDB。如果要修改默認的存儲引擎,可以在參數文件中設置default-table-type。

mysql分支主流有以下三種:

mysql-->oracle公司

mariadb:真正的開源mysql,吸取社區研發的結果,存儲引擎為Aria,是MyISAM的增強版,可以做奔潰後安全恢復,mariadb的引擎有以下三個:

MyISAM-->Aria

InnoDB-->Xtra(Percona公司做補丁到InnoDB,所以性能更好)

tokudb:支持海量存儲

Percona-server(Percona公司發行的mysql數據庫另一個分支)

3 Mysql 配置文件介紹

查看配置文件的順序,同一配置項出現在多個配置文件中,後出現的配置生效,同時,可以用選項defaults-extra-file或者 --defaults-file來定義額外加載的配置文件的路徑

[root@CentOS7A script]#my_print_defaults --verbose

Default options are read from the following files in the given order:

/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf

例子

常用配置

vim /etc/my.cnf.d/server.cnf

[server]

skip_name_resolve = ON #跳過名稱解析

innodb_file_per_table = ON #每表使用獨立的表空間

max_connections = 20000 #最大並發連接數

每一個數據庫相當於是路徑 /var/lib/mysql/下的子目錄,如創建一個數據庫為sunny,那麽在路徑/var/lib/mysql/下就會生成一個目錄為sunny,但是不能直接在目錄/var/lib/mysql/創建子目錄,否則會出現問題,不能生成新的數據庫

4 InnoDB引擎介紹

InnoDB,是MySQL的數據庫引擎之一,為MySQL AB發布binary的標準之一。InnoDB由Innobase Oy公司所開發,2006年五月時由甲骨文公司並購。與傳統的ISAM與MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事務(Transaction)功能,類似於PostgreSQL。

innodb是事務型存儲引擎,適合對事務要求較高的場景中;但較適用於處理大量短期事務(即小事務,即少量語句,如十幾個語句的處理);

基於MVCC(Mutli Version Concurrency Control)支持高並發;支持四個隔離級別,默認級別為REPEATABLE-READ;間隙鎖以防止幻讀;

使用聚集索引(主鍵索引);索引和內容放在一起。一般是有序的,聚集索引只能一個,其他索引都是非聚集的,MyISAM沒有聚集索引

支持”自適應Hash索引“;鍵值數據,即kv

鎖粒度:行級鎖;間隙鎖;關系型數據庫寫鎖是獨占的;

行級鎖:innodb改一行只鎖一行,行級別的力度。myISAM修改一行需要把整張表鎖掉

間隙鎖:鎖住行和行直接的間隙,如查詢的是兩行的信息時,有操作需要在這兩行間插入新的記錄,這裏的間隙鎖,就是鎖住兩行間的間隙,使得不能在兩行間插入間隙

例子:事務的解釋

事務型如A賬號裏減去80,B賬號裏加80,但是萬一系統此時異常,A減去後B還沒加,這個是不允許的,要麽系統正常後,B加上80,要麽A減去的80被還原,這個是基於事務完成的

事務是可交叉並行的,但是要考慮到隔離性

查看所有表的狀態信息(表屬性),如下語句,\G將豎排顯示內容,且每行顯示一次,如果有多行信息,將會分別顯示多次

MariaDB [sunny]> show table status\G;

從物理意義上來講,InnoDB表由共享表空間、日誌文件組(redo文件組)、表結構定義文件組成。若將innodb_file_per_table設置為on,則系統將為每一個表單獨的生成一個table_name.ibd的文件,在此文件中,存儲與該表相關的數據、索引、表的內部數據字典信息。表結構文件則以.frm結尾,這與存儲引擎無關。

數據存儲於“表空間(table space)"中,有兩種方式:

(1) 所有數據庫中的所有類型為InnoDB的表的數據和索引存儲於同一個表空間中;

表空間文件:datadir定義的目錄中,如默認/var/lib/mysql/路徑下,表現為ibdata1, ibdata2, …等文件,文件數量和表數量並不一定是對應的

(2) innodb_file_per_table=ON,意味著每表使用單獨的表空間文件;

每表的數據文件(數據和索引,存儲於數據庫目錄)存儲於自己專用的表空間文件中,並存儲於數據庫目錄下: tbl_name.ibd(表名.ibd)如數據庫sunny下的表classlist,那麽表空間文件為/var/lib/mysql/sunny/classlist.ibd。

表結構的定義:在數據庫目錄,tbl_name.frm(表名.frm) ,如/var/lib/mysql/sunny/classlist.frm,即存儲表格式

ibdata1介紹

innodb系統表空間文件ibdata1存放三種數據:

a)回滾段

b)所有innodb表元數據信息(這就是為什麽innodb無法像myisam表一樣,直接將表定義文件(表名.frm) 和表數據文件(表名.ibd)拷貝到另一個庫中,因為還有部分元數據信息在ibdata1文件中)

c)double write,insert buffer dump 等等

innodb_file_per_table介紹

innodb_file_per_table開啟後,會產生表定義文件表名.frm,和表數據文件 表名.idb,這樣每個表的數據都會存在自己的.idb文件中;如果 關閉,那麽所有的數據都會 存在系統表空間文件 ibdata1文件中,這會ibdata1 非常繁忙並且臃腫 龐大,而且ibdata1無法 收縮的,比如線上將一個 大的表 drop掉,此時ibdata1是無法自動縮小的(需要使用 optimiza table 來優化);而如果開啟,數據存在 .idb文件中,則可以隨時縮小;

共享表空間和獨立表空間優缺點

共享表空間與獨占表空間可以通過參數innodb_file_per_table來轉換,若為1,則開啟獨占表空間,否則,開啟共享表存儲。

在服務器資源有限,單表數據不是特別多的情況下, 獨立表空間明顯比共享方式效率更高 . 但是MySQL 默認是共享表空間 。

具體的共享表空間和獨立表空間優缺點如下:

共享表空間:

優點:

可以放表空間分成多個文件存放到各個磁盤上(表空間文件大小不受表大小的限制,如一個表可以分布在不同步的文件上)。數據和文件放在一起方便管理。

缺點:

所有的數據和索引存放到一個文件中以為著將有一個很常大的文件,雖然可以把一個大文件分成多個小文件,但是多個表及索引在表空間中混合存儲,這樣對於一個表做了大量刪除操作後表空間中將會有大量的空隙,特別是對於統計分析,日值系統這類應用最不適合用共享表空間。

獨立表空間:

優點:

1.每個表都有自已獨立的表空間。

2.每個表的數據和索引都會存在自已的表空間中。

3.可以實現單表在不同的數據庫中移動。

4.空間可以回收(除drop table操作處,表空不能自已回收)

a) Drop table操作自動回收表空間,如果對於統計分析或是日值表,刪除大量數據後可以通過:alter table TableName engine=innodb;回縮不用的空間。

b) 對於使innodb-plugin的Innodb使用truncate table也會使空間收縮。

c) 對於使用獨立表空間的表,不管怎麽刪除,表空間的碎片不會太嚴重的影響性能,而且還有機會處理。

缺點:

單表增加過大,如超過100個G。

註意事項:

※ 對於啟用了innodb_file_per_table 的參數選項之後,在每個表對應的.idb文件內只是存放了數據、索引和插入緩沖,而撤銷(undo)信息,系統事務信息,二次寫緩沖等還是存放在了原來的共享表空間內。

※ 數據段即B+樹的葉節點,索引段即為B+樹的非索引節點。

※ InnoDB存儲引擎的管理是由引擎本身完成的,表空間是由分散的頁和段組成。

※ 區由64個連續的頁組成,每個頁大小為16K,即每個區大小為1MB,創建新表時,先有32頁大小的碎片頁存放數據,使用完後才是區的申請,(InnoDB最多每次申請4個區,保證數據的順序性能)

※ 頁類型有:數據頁、Undo頁、系統頁、事務數據頁、插入緩沖位圖頁、以及插入緩沖空閑列表頁。

innodb小結:innodb的特點

數據存儲:表空間;

並發:MVCC,間隙鎖,行級鎖;

索引:聚集索引、輔助索引;

性能:預讀操作、內存數據緩沖、內存索引緩存、自適應Hash索引、插入操作緩存區;

備份:支持熱備;備份是重點知識。

查看存儲引擎的狀態信息,如InnoDB的狀態

SHOW ENGINE INNODB STATUS;

5 MyISAM引擎介紹

MyISAM的特點:

支持全文索引(FULLTEXT index)、壓縮、空間函數(GIS);這些是innodb不支持的特性

不支持事務

鎖粒度:表級鎖

崩潰無法保證表安全恢復

適用場景:只讀(數據倉庫)或讀多寫少的場景、較小的表(以保證崩潰後恢復的時間較短);

文件:每個表有三個文件,存儲於數據庫目錄中

tbl_name.frm:表格式定義;約束,數據結構

tbl_name.MYD:數據文件;

tbl_name.MYI:索引文件;

例子

創建表tbl1,指定引擎為MyISAM,那麽在路徑/var/lib/mysql/sunny下就會生成三張表tbl1.frm tbl1.MYD tbl1.MYI

create table tbl1 (ID int,name char(4)) engine=MyISAM;

特性:

加鎖和並發:表級鎖;

修復:手動或自動修復、但可能會丟失數據;

索引:非聚集索引;

延遲索引更新;

表壓縮;

innodb支持在線事務,myISAM支持只讀的數據倉庫或者讀多寫少的場景

6 其它的存儲引擎

CSV:將CSV文件(以逗號分隔字段的文本文件)作為MySQL表文件;

MRG_MYISAM:將多個MyISAM表合並成的虛擬表;

BLACKHOLE:黑洞,類似於/dev/null,不真正存儲數據;存進來的數據全部丟棄

MEMORY:內存存儲引擎,支持hash索引,表級鎖,常用於臨時表;不能持久存儲

FEDERATED: 用於訪問其它遠程MySQL服務器上表的存儲引擎接口;

MariaDB額外支持很多種存儲引擎:

OQGraph、SphinxSE、TokuDB、Cassandra、CONNECT、SQUENCE、...

InnoDB內容參考如下內容

https://www.cnblogs.com/benshan/archive/2013/01/08/2851714.html

https://www.cnblogs.com/Aiapple/p/5689634.html

https://baike.baidu.com/item/innodb/8970025?fr=aladdin


數據庫 之 Mysql存儲引擎介紹