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. hdoj5792 【树状数组】【未完待续】

    题意: 求有多少种四个数满足Aa < Ab,Ac > Ad,1 < =a < b < = n ,1 < = c < d < = n ; 思路: 只要找到 ...

  2. AT2534 港湾設備 (Port Facility)

    洛谷 先膜一下Iscream巨巨 首先我们可以把题目转化为线段覆盖,如果两条线段相交(不算某一条完全在另一条里面的情况),那么这两条线段代表的集装箱就不能放到同一个栈里,我们在它们之间连一条边.如果图 ...

  3. bug日志-天坑,Spring Security的登陆报错:An internal error occurred while trying to authenticate the user.

    在学习Spring Security的时候,我的编辑器给我报错:An internal error occurred while trying to authenticate the user. 明明 ...

  4. LuoguP2700逐个击破【并查集/生成树/正难则反】By cellur925

    题目传送门 题目大意:给你一棵树,求把其中k个点相互隔离(不连通)所需要的边权代价. 这题我开始是想要求出把k个点联通的最小代价的,但后来发现还是实现起来比较困难,题解里貌似也没有这种做法,于是就鸽了 ...

  5. Jquery | 基础 | 使用 jQuery 表单过滤选择器

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. UvaLive6442(思维、结论)

    结论是:按位置排序好以后,对于真正的答案,走法应该是:依次走向第0个等分点,第1个等分点……这样对于这种等分情况,是最优的调度. /* 先假设一个终点位置然后按位站好 这个位置不一定是最优所以要调 调 ...

  7. Educational Codeforces Round 24 B

    n children are standing in a circle and playing a game. Children's numbers in clockwise order form a ...

  8. 题解报告:hdu 1520 Anniversary party(树形dp入门)

    Problem Description There is going to be a party to celebrate the 80-th Anniversary of the Ural Stat ...

  9. HDU 5808 Price List Strike Back bitset优化的背包。。水过去了

    http://acm.hdu.edu.cn/showproblem.php?pid=5808 用bitset<120>dp,表示dp[0] = true,表示0出现过,dp[100] = ...

  10. hihocoder1078 线段树的区间修改

    思路: 线段树区间更新.注意这里是把一个区间的所有数全部赋值为一个新的值. 实现: #include <bits/stdc++.h> using namespace std; ; ], l ...