共享表空間VS獨立表空間
概念: 共享表空間 、獨立表空間
【共享表空間】
又稱為system tablespace系統表空間,a small set of data files (the ibdata files) 。
一、共享表空間ibdata1
1、數據字典(data dictionary):記錄數據庫相關信息
2、doublewrite write buffer:解決部分寫失敗(頁斷裂)
3、insert buffer:內存insert buffer數據,周期寫入共享表空間,防止意外宕機
4、回滾段(rollback segments)
5、undo空間:undo頁
二、關於ibdata1的增長考慮
影響共享表空間增長的對象:insert buffer、undo空間
1、什麽時候undo暴漲:
1、大事務為主,例如修改了40萬行才提交
2、長事務導致的undo持續增加
2、insert buffer空間很大
1、索引建立過多
2、很多索引不怎麽使用
3、索引和主鍵順序嚴重不一致:主鍵的建立選擇有問題
所以===
ibdata1使用時要註意:在初始化ibdata1時,最好是設置大一些,避免由於高並發突然暴增,影響性能。
三、對ibdata的的設置最佳實踐
註意:初始化設置,後期設置就沒有意義。
1、空間大小
innodb表是按表空間進行存放的,共享表空間ibdata1默認初始化大小是12M。
mysql> show variables like ‘innodb_data_file_path‘;
+-----------------------+------------------------+
| Variable_name | Value |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend |
+-----------------------+------------------------+
1 row in set, 1 warning (0.47 sec)
初始化:innodb_data_file_path=ibdata1:10G:ibdata2:10G:autoextend
2、undo分離
undo最容易導致ibdata1暴漲,所以需要將undo分離出去,只能在初始化的時候做,初始化之後就沒有辦法實現undo分離。
處理:
在初始化實例之前,只需要設置 innodb_undo_tablespaces 參數,默認是等於0即指單獨存放的undo表空間個數為0,也就是undo為分離;建議將該參數設置大於等於3,即可將undo log設置到單獨的undo表空間中。
【獨立表空間】
一、innodb_file_per_table=1
MySQL 5.6.6之前的版本,InnoDB 默認會將所有的數據庫InnoDB引擎的表數據存儲在一個共享空間中:ibdata1,這樣就會讓管理感覺很難受,增刪數據庫的時候,ibdata1文件不會自動收縮,單個數據庫的備份也將成為問題。通常只能將數據使用mysqldump 導出,然後再導入解決這個問題。
在之後的版本,為了優化上述問題,獨立表空間innodb_file_per_table參數默認開啟:
mysql> show variables like ‘innodb_file_per_table‘;
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set, 1 warning (0.05 sec)
可以修改InnoDB為獨立表空間模式,每個數據庫的每個表都會生成一個數據空間。
二、獨立表空間的性能優越
1、優點:
1、每個表都有自已獨立的表空間。
2、每個表的數據和索引都會存在自已的表空間中。
3、可以實現單表在不同的數據庫中移動。
4、空間可以回收
5、對於使用獨立表空間的表,不管怎麽刪除,表空間的碎片不會太嚴重的影響性能,而且還有機會處理。
2、缺點:
單表增加比共享空間方式更大。
3、共享表空間在Insert操作上少有優勢,其它都沒獨立表空間表現好。當啟用獨立表空間時,合理調整:innodb_open_files(指定InnoDB一次可以保持打開的.ibd文件的最大數目)。
共享表空間VS獨立表空間