4. InnoDB表单独表空间
4. InnoDB表单独表空间
从历史上看,所有InnoDB表和索引都存储在系统表空间中。这种单片方法的目标是完全专用于数据库处理的机器,精心规划的数据增长,其中任何分配给MySQL的磁盘存储都不会用于其他目的。
每张InnoDB表的单独表空间功能提供了一种更灵活的替代方案,其中每张InnoDB表及其索引都存储在一个单独的 .ibd数据文件中。每个这样的 .ibd数据文件代表一个单独的表空间。此功能由 innodb_file_per_table 配置选项,默认情况下在MySQL 5.6.6及更高版本中启用。
mysql> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.01 sec)
4.1 File-Per-Table表空间的优点
truncate 或删除存储在单独表空间中的表时,可以回收磁盘空间。truncate 或删除存储在共享系统表空间中的表会在系统表空间数据文件(ibdata文件)内部创建可用空间,该数据文件只能用于新 InnoDB数据。
TRUNCATE TABLE在存储在单独表空间中的表上运行时 ,操作更快。
可以将特定表存储在单独的存储设备上,以进行I/O优化,空间管理或备份。在以前的版本中,您必须将整个数据库目录移动到其他驱动器并在MySQL数据目录中创建符号链接
shell> mkdir /dr1/databases/test
shell> ln -s /dr1/databases/test /path/to/datadir
在MySQL 5.6.6及更高版本中,您可以使用语法指定每个表的位置,如:
CREATE TABLE t11 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/data/mysql/mysql3306';
- 可以运行OPTIMIZE TABLE以压缩或重新创建单独表空间。
运行OPTIMIZE TABLE, InnoDB创建一个新的.ibd具有临时名称的文件,只使用存储的实际数据所需的空间。优化完成后,InnoDB删除旧.ibd文件并将其替换为新文件。如果先前的.ibd文件显着增长但实际数据仅占其大小的一部分,则运行OPTIMIZE TABLE可以回收未使用的空间。
root@localhost [test] 17:03:31>optimize table account;
+--------------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+--------------+----------+----------+-------------------------------------------------------------------+
| test.account | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.account | optimize | status | OK |
+--------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.09 sec)
- 可以移动单张InnoDB表而不是整个数据库
移动单张innodb表方法
0)source:查看源端xx表结构(show create table xx;)
1)target:create table xx (与source端一致,且表结构必须一致)
2)target:alter table xx discard tablespace;
3)source:flush table xx for export;
4)source:备份表(xx.ibd)文件至target
5)target:修改权限为mysql(如果不修改权限,导入时将会报如下错误)
ERROR 1812 (HY000): Tablespace is missing for table `move_db`.`account`.
6)target:alter table xx import tablespace;
可以将单张InnoDB表从一个MySQL实例复制到另一个MySQL实例(称为可 传输表空间功能)。
在单独表空间中创建的表使用
Barracuda文件格式。Barracuda文件格式支持 压缩 和动态行格式等功能。可以使用动态行格式为具有大型BLOB或TEXT列的表启用更高效的存储
在发生损坏,无法重新启动服务器或备份和二进制日志不可用时,单独表空间恢复可以提高恢复成功率以节省时间。
可以使用MySQL Enterprise Backup产品快速备份或还原单个表,而不会中断其他InnoDB表的使用。
在复制或备份表时,单独表空间便于每表状态报告。
可以在文件系统级别监视表大小,而无需访问MySQL。
当innodb_flush_method设置为 常见Linux文件系统时,不允许对单个文件进行并发写入 O_DIRECT。因此,在使用单独表空间时,可能会有性能提升。

系统表空间存储数据字典和撤消日志,并且受InnoDB表空间大小限制的限制。使用单独表空间,每个表都有自己的表空间,这为增长提供了空间。
4.2 File-Per-Table表空间的潜在缺点
对于单独表空间,每个表可能有未使用的空间,只能由同一个表的行使用。如果管理不当,这可能会导致空间浪费。
fsync操作必须在每个打开的表上运行,而不是在单个文件上运行。由于fsync每个文件都有单独的操作,因此无法将多个表上的写操作组合到单个I / O操作中。这可能需要 InnoDB执行更高的fsync操作总数 。
mysqld必须为每个表保留一个打开的文件句柄,如果在单独表空间中有许多表,这可能会影响性能。
使用了更多的文件描述符。
innodb_file_per_table在MySQL 5.6.6及更高版本中默认启用。如果担心与MySQL 5.5或5.1的向后兼容性,您可以考虑禁用它。在 重新创建table()的情况下,禁用innodb_file_per_table 会阻止ALTER TABLE将InnoDB表从系统表空间移动到单个.ibd文件。
如果许多表正在增长,则可能存在更多碎片,这可能会影响DROP TABLE表扫描性能。但是,在管理碎片时,在自己的表空间中放置文件可以提高性能。
删除单独表空间时会扫描缓冲池,对于数十GB的缓冲池,这可能需要几秒钟。使用广泛的内部锁执行扫描,这可能会延迟其他操作。系统表空间中的表不受影响。
innodb_autoextend_increment 变量定义了增量大小(以MB为单位),用于在自动扩展共享表空间文件变满时扩展其大小,不适用于单独表空间文件,无论innodb_autoextend_increment 设置如何,这些文件都是自动扩展的 。初始扩展是少量的,之后扩展以4MB的增量发生。
4. InnoDB表单独表空间的更多相关文章
- INNODB存储引擎表空间
这片文章主要是对innodb表空间的一些说明: innodb中表空间可以分为以下几种: 系统表空间 独立表空间 undo表空间 临时表空间(temporary tablespace) 通用表空间(ge ...
- 6. 将单独表空间(File-Per-Table Tablespaces)复制到另一个实例
6. 将单独表空间复制到另一个实例 本节介绍如何将单独表空间从一个MySQL实例复制 到另一个MySQL实例,也称为可传输表空间功能. 将InnoDB单独表空间复制到其他实例的原因有很多: - 在不对 ...
- mysql InnoDB引擎 共享表空间和独立表空间(转载)
PS:innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间. 1.什么是共享表空间和独占表空 ...
- Innodb之(临时)表空间、段、区、块
引用连接:https://www.cnblogs.com/duanxz/p/3724120.html 对于innodb存储引擎而言,其数据文件最小的存储单位为页.默认为16KB大小.在页的基础上又分为 ...
- 15.3、mysql之InnoDB和MyISAM表空间详解
15.3.1.InnoDB引擎表空间: 1.表空间分类: 共享表空间: 某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在 data目录下. 默认的文件名为:ibd ...
- InnoDB 引擎独立表空间 innodb_file_per_table
使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:表结构.表索引.表数据空间.我们可以将某个数据库目录直接迁移到其他数据库也可以正常工作.然而当你 ...
- MySQL Innodb Engine --独立表空间参数(innodb_file_per_table)
MySQL中参数innodb_file_per_table决定将表存放于ibdata*的共享表空间还是独立的.ibd文件的独立表空间. ================================ ...
- InnoDB 引擎独立表空间
InnoDB 引擎独立表空间 使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:表结构.表索引.表数据空间.我们可以将某个数据库目录直接迁移到 ...
- 5. 在Datadir目录外创建单独表空间
5. 在Datadir目录外创建单独表空间 要在MySQL dadadir之外的位置创建单独表空间,请使用该子句: DATA DIRECTORY = '/path' 在目标目录中,MySQL会创建一个 ...
随机推荐
- TFS 用户设置read权限后仍然无法查看代码的问题
TFS 2013 在visual studio , team explorer , source control explorer 中点击 文件夹 右键菜单 Security 打开一个winform( ...
- TC学习总结
带宽管理: TC中规定描述带宽: mbps = 1024 kbps = 1024 * 1024 bps => byte/s mbit = 1024 kbit => kilo bit/s m ...
- Beta版本冲刺第一天!
该作业所属课程:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业地址:https://edu.cnblogs.com/c ...
- SQL SUM函数内使用CASE函数
- 实例 - 在这个表里进行查询: 查询出如下结果(统计每天的输赢次数): - 开始查询 - 首先创建测试表: CREATE TABLE info( date ), result ) ); 插入测试数 ...
- 写一个类继承socket时遇到的问题(TCP)
主要为题出在服务器端的accept()函数,他返回两个参数,一个套接字和一个客户端的ip和端口组成的元组. 问题就出在这个套接字这里,我们继承了socket这个类,这个套接字创建的时候是通过socke ...
- Baker Vai LightOJ - 1071
题意:类似传纸条 方法: 把他要求的操作(一个人来回),转化为两个人同时走,除了开始和结束位置只能走不同路,得到的分数和的最大值即可. 一开始想到要定义的状态,是两个人的x(行)和y(列)坐标.这样时 ...
- magento layout xml 小结
基础概念: http://magebase.com/magento-tutorials/demystifying-magentos-layout-xml-part-1/ 调试方案函数: $this-& ...
- h5-27-存储/读取JS对象
存储JS对象 <script type="text/javascript"> /*封装人员信息*/ function Person(id,name,age) { thi ...
- jQuery removeAttr() 源码解读
removeAttr比attr的代码要简单很多~~~ removeAttr: function( name ) { return this.each(function() { jQuery.remov ...
- MVC 下 ajax调用 日期差值计算
背景: 服务项目已有服务期起止时间From-To 现在要根据用户输入的新的起始时间, 和该服务期的原有区间值, 计算出新的服务期截止时间 即 NewServiceToDateTime = NewSer ...