Mysql-InnoDB獨(dú)立表空間

前文索引:Mysql基礎(chǔ)-存儲引擎詳述

1.簡介

? ? Innodb存儲引擎可將所有數(shù)據(jù)存放于ibdata*的共享表空間,也可將每張表存放于獨(dú)立的.ibd文件的獨(dú)立表空間。

? ? 共享表空間以及獨(dú)立表空間都是針對數(shù)據(jù)的存儲方式而言的。

? ? 共享表空間: ?某一個(gè)數(shù)據(jù)庫的所有的表數(shù)據(jù),索引文件全部放在一個(gè)文件中,默認(rèn)這個(gè)共享表空間的文件路徑在data目錄下。 默認(rèn)的文件名為:ibdata1 ?初始化為10M。

? ? 獨(dú)立表空間: ?每一個(gè)表都將會生成以獨(dú)立的文件方式來進(jìn)行存儲,每一個(gè)表都有一個(gè).frm表描述文件,還有一個(gè).ibd文件。 其中這個(gè)文件包括了單獨(dú)一個(gè)表的數(shù)據(jù)內(nèi)容以及索引內(nèi)容,默認(rèn)情況下它的存儲位置也是在表的位置之中。

2.二者優(yōu)缺點(diǎn)

? ? 2.1 共享表空間:

? ? 優(yōu)點(diǎn):可以將表空間分成多個(gè)文件存放到各個(gè)磁盤上(表空間文件大小不受表大小的限制,如一個(gè)表可以分布在不同的文件上)。數(shù)據(jù)和文件放在一起方便管理。

? ? 缺點(diǎn):所有的數(shù)據(jù)和索引存放到一個(gè)文件中,雖然可以把一個(gè)大文件分成多個(gè)小文件,但是多個(gè)表及索引在表空間中混合存儲,這樣對于一個(gè)表做了大量刪除操作后表空間中將會有大量的空隙,特別是對于統(tǒng)計(jì)分析,日值系統(tǒng)這類應(yīng)用最不適合用共享表空間。

? ? 2.2 獨(dú)立表空間:

? ? 在配置文件(my.cnf)中設(shè)置: innodb_file_per_table

? ? 優(yōu)點(diǎn):

? ? 1.每個(gè)表都有自已獨(dú)立的表空間。

? ? 2.每個(gè)表的數(shù)據(jù)和索引都會存在自已的表空間中。

? ? 3.可以實(shí)現(xiàn)單表在不同的數(shù)據(jù)庫中移動(dòng)。

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

? ? ? ? a.Drop table操作自動(dòng)回收表空間,如果對于統(tǒng)計(jì)分析或是日值表,刪除大量數(shù)據(jù)后可以通過:alter table TableName engine=innodb;回縮不用的空間。

? ? ? ? b.對于使innodb-plugin的Innodb使用turncate table也會使空間收縮。

? ? ? ? c.對于使用獨(dú)立表空間的表,不管怎么刪除,表空間的碎片不會太嚴(yán)重的影響性能,而且還有機(jī)會處理。

? ? 缺點(diǎn):

? ? 單表增加過大,如超過100個(gè)G。

? ? 相比較之下,使用獨(dú)占表空間的效率以及性能會更高一點(diǎn)。

3.獨(dú)立表空間參數(shù)innodb_file_per_table詳解

? ? 3.1參數(shù)列表:

innodb_file_per_table

? ? 3.2 參數(shù)功能

? ? 該參數(shù)在mysql5.6.6及其后續(xù)版本默認(rèn)開啟,開啟該參數(shù)的時(shí)候,Innodb將每個(gè)新創(chuàng)建的表的數(shù)據(jù)及索引存儲在一個(gè)獨(dú)立的.ibd文件里,而不是系統(tǒng)的表空間。當(dāng)這些innodb表被刪除或清空的時(shí)候,存儲空間會被回收。

? ? 開啟innodb_file_per_table,在ALTER TABLE操作重建表的情況下,會將innodb表從系統(tǒng)共享表空間移動(dòng)到獨(dú)立的.ibd文件。

? ? 不開啟innodb_file_per_table,innodb會將所有表及索引的數(shù)據(jù)存儲在構(gòu)成系統(tǒng)表空間的ibdata文件。這樣會降低文件系統(tǒng)操作的性能開銷,例如DROP TABLE 或 TRUNCATE TABLE。它最適合于將整合磁盤都用于存儲mysql數(shù)據(jù)的情況,因?yàn)橄到y(tǒng)表空間不會收縮,所有的數(shù)據(jù)庫都在一個(gè)空間實(shí)例里面。當(dāng)innodb_file_per_table=OFF的時(shí)候,應(yīng)避免在空間受限的系統(tǒng)表空間里導(dǎo)入大量臨時(shí)數(shù)據(jù)。

? ? innodb_file_per_table 可通過SET GLOBAL動(dòng)態(tài)的修改為ON或OFF,也可以在my.cnf中做永久性修改,在my.cnf中修改后生效的話需要重啟mysqld服務(wù)。

mysql> set global innodb_file_per_table =ON;

mysql> show variables like '%per_table%';

+-----------------------+-------+

| Variable_name? ? ? ? | Value |

+-----------------------+-------+

| innodb_file_per_table | ON? ? |

+-----------------------+-------+

? ? 注:動(dòng)態(tài)修改后僅對后續(xù)操作生效,如原來為共享表空間,動(dòng)態(tài)修改為獨(dú)立表空間后僅新建的表為獨(dú)立表空間。

4.innodb共享表空間轉(zhuǎn)化為獨(dú)立表空間

? ? 查看當(dāng)前表空間情況:

mysql> show variables like '%per_table';

+-----------------------+-------+

| Variable_name? ? ? ? | Value |

+-----------------------+-------+

| innodb_file_per_table | OFF? |

+-----------------------+-------+

? ? 表示當(dāng)前是共享表空間。

? ? 想要將共享表空間轉(zhuǎn)化為獨(dú)立表空間有兩種方法:

? ? 1.先邏輯備份,然后修改配置文件my.cnf中的參數(shù)innodb_file_per_table參數(shù)為1,重啟服務(wù)后將邏輯備份導(dǎo)入即可。

? ? 2.修改配置文件my.cnf中的參數(shù)innodb_file_per_table參數(shù)為1,重啟服務(wù)后將需要修改的所有innodb表都執(zhí)行一遍:alter table table_name engine=innodb;

? ? 使用第二種方式修改后,原來庫中的表中的數(shù)據(jù)會繼續(xù)存放于ibdata1中,新建的表才會使用獨(dú)立表空間

****************************************************************************************

? ? 原文地址:https://blog.csdn.net/JesseYoung/article/details/42236615

? ? 博客主頁:http://blog.csdn.net/jesseyoung

****************************************************************************************

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容