MySql備忘 -- Innodb共享表空間VS獨立表空間

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

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

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

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

  共享表空間:

  優點:

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

  缺點:

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

  我們知道共享表空間管理會出現表空間分配後不能回縮的問題,當出現臨時建索引或是創建一個臨時表的操作表空間擴大後,就是刪除相關的表也沒辦法回縮那部分空間了。我們存在磁盤監控時,也許就報警不斷了,但實際上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)         對於使用獨立表空間的表,不管怎麼刪除,表空間的碎片不會太嚴重的影響性能,而且還有機會處理。

  缺點:

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

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

  備份:

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

  監控:

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

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

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

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

  從Linux系統處理上出發:

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


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