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

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

 

在使用Innodb引擎時將要面對兩種表空間的管理選擇的問題,Innodb有兩種管理表空間的方法: 

 

1.  共享表空間(也可以拆分成多個小的表空間) 

 

2.  獨立表空間每一個表有一個獨立的表空間。 

 

我個人推薦使用獨立表空間。在性能和運維上獨立表空間比共享的表空間有很多優勢。下面我將分別說明一下兩種表空間管理的特點。 

 

共享表空間: 

 

優點: 

 

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

 

缺點: www.aiwalls.com  

 

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

 

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

 

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

 

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

 

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

 

獨立表空間: 

 

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

 

優點: 

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

缺點:   www.aiwalls.com  

 

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

 

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

 

備份: 

 

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

 

監控: www.aiwalls.com  

 

可以更好從系統上監控數據的大小,每個表的大小。 

 

另外推薦使用獨立表空間的原因: 

 

從性能上對比共享表空間和獨立表空間: 

 

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

 

從Linux系統處理上出發: 

 

文件系統fsync一大片更新數據,對系統io沖擊較大。若分隔成多個小數據fsync,能夠減少對讀的影響。 同時從mysql代碼,發現mysql保證兩次fsync之間至少有20ms的sleep,這樣的話,若將一次fsync變成多次小數據操作,應該能夠減少慢查詢的比例。所以對於大量更新操作的系統不太適合用共享表空間。

 

來源 https://www.mysqlsupport.cn/
 

發佈留言