innodb共享表空間vs獨立表空間

使用過MySQL的同學,剛開始接觸最多的莫過於MyISAM表引擎了,這種引擎的數據庫會分別創建三個文件:表結構、表索引、表數據空間。我們可以將某個數據庫目錄直接遷移到其他數據庫也可以正常工作。然而當你使用InnoDB的時候,一切都變了。

 

InnoDB 默認會將所有的數據庫InnoDB引擎的表數據存儲在一個共享空間中:ibdata1,這樣就感覺不爽,增刪數據庫的時候,ibdata1文件不會自動收縮,單個數據庫的備份也將成爲問題。通常只能將數據使用mysqldump 導出,然後再導入解決這個問題。

 

MySQL的配置文件[mysqld]部分,增加innodb_file_per_table參數。

 

可以修改InnoDB爲獨立表空間模式,每個數據庫的每個表都會生成一個數據空間。

 

獨立表空間:

 

優點:

 

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

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

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

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

 

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

 

b)         對於使innodb-pluginInnodb使用turncate table也會使空間收縮。

 

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

 

缺點:

 

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

 

對於單表增長過大的問題,如果使用共享表空間可以把文件分開,但有同樣有一個問題,如果訪問的範圍過大同樣會訪問多個文件,一樣會比較慢。對於獨立表空間也有一個解決辦法是:使用分區表,也可以把那個大的表空間移動到別的空間上然後做一個連接。其實從性能上出發,當一個表超過100G有可能響應也是較慢了,對於獨立表空間還容易發現問題早做處理。

共享表空間: 

 

優點: 

 

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

 

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

 

我們知道共享表空間管理會出現表空間分配後不能回縮的問題,當出現臨時建索引或是創建一個臨時表的操作表空間擴大後,就是刪除相關的表也沒辦法回縮那部分空間了。我們存在磁盤監控時,也許就報警不斷了,但實際上MySQL還可以運行良好。另外,當磁盤上佔用較多時性能也不是太好。 

 

這種情況處理只能是是建一個新的Slave從主庫上Dump出來,然後在Dump到從庫中,動作較大。 

 

對於InnoDB Hot Backup備份的操作(或是直接冷備),每次需要CP的文件比較大。如果現在有180G的表空間,但實際數據只有50G,那麼我們將面對每次需要拷180G的數據。 

 

這種方式也許mysqldump是一個好的處理方式了。 

 

 

結論:

 

共享表空間在Insert操作上少有優勢。其它都沒獨立表空間表現好。當啓用獨立表空間時,請合理調整一下:innodb_open_files

 

InnoDB Hot Backup(冷備)的表空間cp不會面對很多無用的copy了。而且利用innodb hot backup及表空間的管理命令可以實現單現移動。

 

 

 

1.innodb_file_per_table設置.開啓方法:

my.cnf[mysqld]下設置

innodb_file_per_table=1

 

2.查看是否開啓:

mysql> show variables like ‘%per_table%’;

 

3.關閉獨享表空間

innodb_file_per_table=0關閉獨立的表空間

mysql> show variables like ‘%per_table%’;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章