天天看點

Innodb共享表空間VS獨立表空間

ps: 先留這兒,給力。。。

在使用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變成多次小資料操作,應該能夠減少慢查詢的比例。是以對于大量更新操作的系統不太适合用共享表空間。

<a target="_blank" href="http://www.mysqlsupport.cn/innodb%e5%85%b1%e4%ba%ab%e8%a1%a8%e7%a9%ba%e9%97%b4vs%e7%8b%ac%e7%ab%8b%e8%a1%a8%e7%a9%ba%e9%97%b4/">原文位址</a>