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表单独表空间的更多相关文章

  1. INNODB存储引擎表空间

    这片文章主要是对innodb表空间的一些说明: innodb中表空间可以分为以下几种: 系统表空间 独立表空间 undo表空间 临时表空间(temporary tablespace) 通用表空间(ge ...

  2. 6. 将单独表空间(File-Per-Table Tablespaces)复制到另一个实例

    6. 将单独表空间复制到另一个实例 本节介绍如何将单独表空间从一个MySQL实例复制 到另一个MySQL实例,也称为可传输表空间功能. 将InnoDB单独表空间复制到其他实例的原因有很多: - 在不对 ...

  3. mysql InnoDB引擎 共享表空间和独立表空间(转载)

    PS:innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间. 1.什么是共享表空间和独占表空 ...

  4. Innodb之(临时)表空间、段、区、块

    引用连接:https://www.cnblogs.com/duanxz/p/3724120.html 对于innodb存储引擎而言,其数据文件最小的存储单位为页.默认为16KB大小.在页的基础上又分为 ...

  5. 15.3、mysql之InnoDB和MyISAM表空间详解

    15.3.1.InnoDB引擎表空间: 1.表空间分类: 共享表空间: 某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在 data目录下. 默认的文件名为:ibd ...

  6. InnoDB 引擎独立表空间 innodb_file_per_table

    使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:表结构.表索引.表数据空间.我们可以将某个数据库目录直接迁移到其他数据库也可以正常工作.然而当你 ...

  7. MySQL Innodb Engine --独立表空间参数(innodb_file_per_table)

    MySQL中参数innodb_file_per_table决定将表存放于ibdata*的共享表空间还是独立的.ibd文件的独立表空间. ================================ ...

  8. InnoDB 引擎独立表空间

    InnoDB 引擎独立表空间   使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:表结构.表索引.表数据空间.我们可以将某个数据库目录直接迁移到 ...

  9. 5. 在Datadir目录外创建单独表空间

    5. 在Datadir目录外创建单独表空间 要在MySQL dadadir之外的位置创建单独表空间,请使用该子句: DATA DIRECTORY = '/path' 在目标目录中,MySQL会创建一个 ...

随机推荐

  1. windows 远程连接 密码正确但是无法登陆,提示证书不正确

    问题: windows8.1 远程连接 windows8 进入输入用户名密码环节,用户名,密码都正确,但是无法登陆 连接时,下方写着 域名 MicrosoftAccount 解决: 在输入密码后,点击 ...

  2. python __builtins__ tuple类 (68)

    68.'tuple', 转换为元组类型 class tuple(object) | tuple() -> empty tuple | tuple(iterable) -> tuple in ...

  3. P1226神经网络

    提交了7次,看了无数题解,要死啊~~~.(无限吐槽这道题...) 据说是Toposort,我其实也不是很清楚,反正BFS就可以过:写题之前先把题看懂: 根据公式,因为入度为零的点不会被传递,所以阈值是 ...

  4. C#操作高低位

    比如一个数 想把高位 与地位拆开,分别显示 可以用这个办法 x=(uint16)(x>>8)   (高字节向右移动8位 相当于*256) X=(UINT16)(X &0X00FF) ...

  5. Query on a tree again! SPOJ - QTREE3

    https://vjudge.net/problem/SPOJ-QTREE3 https://www.luogu.org/problemnew/show/P4116 一个log(LCT)比两个log( ...

  6. ios NSFileManager 用法详解

    转自:http://blog.csdn.net/ios_che/article/details/7287266 iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过ipho ...

  7. ios学习笔记 UITableView(纯代码) (一)

    参考 “https://www.cnblogs.com/ai-developers/p/4557487.html” UITableViewCell 有一个代码重用 减少资源的浪费 参考  https: ...

  8. 代码审查的艺术:Dropbox 的故事

    Dropbox 的 iOS 应用中的每一行代码,都是开始于被添加到 Maniphest 中的一个 bug 或者功能任务,Maniphest 是我们的任务管理系统.当一位工程师在上面接受一个任务,那么在 ...

  9. CF385C Bear and Prime Numbers

    思路: 需要对埃氏筛法的时间复杂度有正确的认识(O(nlog(log(n)))),我都以为肯定超时了,结果能过. 实现: #include <bits/stdc++.h> using na ...

  10. void运算符

    void是一元运算符,它出现在操作数之前,操作数可以是任意类型,操作数会照常计算,但忽略计算结果并返回undefined.由于void会忽略操作数的值,因此在操作数具有副作用的时候使用void来让程序 ...