標籤:
PS:innodb這種引擎,與MYISAM引擎的區別很大.特別是它的資料存放區格式等.對於innodb的資料結構,首先要解決兩個概念性的問題: 共用資料表空間以及獨佔資料表空間.
1、什麼是共用資料表空間和獨佔資料表空間
共用資料表空間以及獨佔資料表空間都是針對innodb表的資料存放區而言的,ibdata1為innodb引擎的儲存資料與索引的資料檔案,ib_logfile0與ib_logfile1為innodb引擎使用的記錄檔
共用資料表空間: mysql伺服器中所有資料庫的innodb表(資料,索引)全部放在一個檔案中,預設這個共用資料表空間的檔案路徑在data目錄下. 預設的檔案名稱為:ibdata1 初始化為10M.
獨佔資料表空間: 每一個表都將會產生以獨立的檔案方式來進行儲存,每一個表都有一個.frm表描述檔案,還有一個.ibd檔案. 其中這個檔案包括了單獨一個表的資料內容以及索引內容,預設情況下它的儲存位置也是在表的位置之中.
2、兩者之間的優缺點
- 共用資料表空間:
優點:
InnoDB在共用資料表空間模式下,是支援多檔案的,用innodb_data_file_path選項可以配置:
innodb_data_file_path = /disk1/ibdata1:2G;/disk2/ibdata2:2G:autoextend
這樣配置就把資料檔案分散在了disk1和disk2兩個路徑下,第一個檔案固定2G大小,第二個檔案初始化2G,可以自增長.(資料檔案大小不受表大小的限制,如一個表可以分布在不同的資料檔案上).資料和檔案放在一起方便管理.
缺點:
1.所有的資料和索引存放到一個檔案中意味著將有一個很常大的檔案,雖然可以把一個大檔案分成多個小檔案,但是伺服器上的所有庫中的innodb表及索引在資料表空間中混合儲存,這樣對於一個表做了大量刪除操作後資料表空間中將會有大量的空隙,特別是對於統計分析,日值系統這類應用最不適合用共用資料表空間.
2.共用資料表空間不會收縮! ibdata1 只會一個勁的增長.對於一台伺服器上面n個庫而且存在刪除庫的的情況就鬱悶了!
- 獨立資料表空間:
在設定檔(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有可能響應也 是較慢了,對於獨立資料表空間還容易發現問題早做處理.
相比較之下,使用獨佔資料表空間的效率以及效能會更高一點,推薦使用獨立資料表空間的原因:
- 從效能上對比共用資料表空間和獨立資料表空間:
共用資料表空間在Insert操作上少有優勢.其它都沒獨立資料表空間表現好.這裡也有一個TIPS當啟用獨立資料表空間時,請合理調整一下:innodb_open_files .
- 從Linux系統處理上出發:
檔案系統fsync一大片更新資料,對系統io衝擊較大.若分隔成多個小資料fsync,能夠減少對讀的影響. 同時從mysql代碼,發現mysql保證兩次fsync之間至少有20ms的sleep,這樣的話,若將一次fsync變成多次小資料操作,應該能夠減 少慢查詢的比例.所以對於大量更新操作的系統不太適合用共用資料表空間
轉自(http://wangying.sinaapp.com/archives/1488)
mysql InnoDB引擎 共用資料表空間和獨立資料表空間(轉載)