• 14.4.4 InnoDB File-Per-Table Tablespaces


    14.4.4 InnoDB File-Per-Table Tablespaces

    14.4.4.1 Enabling and Disabling File-Per-Table Tablespaces

    从历史上看, 所有的InnoDB 表和Indexes 是存储在system 表空间。

    这个整体的方法是针对机器完全致力于数据库处理, 精心策划的数据增长,

    任何磁盘存储分配给MySQL 不需要用于其他的目的。

    InnoDB 的file-per-table tablespace提供一个更加灵活的选择,

    每个InnoDB 表和它的indexes 是单独存储在.ibd 数据文件。

    每个.idb 数据文件代表一个单独的表空间。这个功能是通过 innodb_file_per_table 配置选项控制,

    在5.6.6和更高的版本默认启用

    File-Per-Table Tablespaces 的优势:

    1.你可以回收磁盘空间当truncate或者drop 一个表以 file-per-table tablepace 方式存储。

    truncate或者drop 表存储在system tablespace 创建的空闲的空间初始在system tablespace 数据文件
    (iddata files),只能用于新的InnoDB data.

    1. TRUNCATE TABLE 操作是更快的当运行在以file-per-table tablepaces方式存储。

    3.你可以存储单独的表在单独的存储系统,用于I/O优化,空间管理,或者备份目的。

    在以前的版本中, 你需要移动整个数据库目录到其他驱动器,创建软连接 在mysql 数据目录,

    在8.12.4章节描述, “Using Symbolic Links”.

    在MySQL 5.6.6和更高的版本, 你可以指定每个表的位置使用 语句 CREATE TABLE … DATA DIRECTORY =

    absolute_path_to_directory,

    你可以
    运行 OPTIMIZE TABLE 来压缩或者重新创建一个 file-per-table tablespace.

    当你运行 一个OPTIMIZE TABLE, InnoDB 创建一个新的.ibd 文件 使用一个临时文件名,

    只使用需要的空间来存储实际的数据。当优化完成后,如果先前的.ibd 文件增长明显,但实际数据只占其体积的一小部分

    ,

    OPTIMIZE TABLE
    运行可以回收不使用的空间。

    你可以删除单个InnoDB 表相比整个数据库

    你可以复制单个InnoDB 表从一个MySQL 实例到另外一个(被称为表空间传输特性)

    以 file-per-table tablespaces 创建的表使用Barracuda file format.

    Barracuda file 格式启用特性比如压缩和动态的行格式。

    表创建在 system tablespace 不能使用那些特性。利用这些特性对于一个存在的表,启用innodb_file_per_table

    setting 运行

    ALTER TABLE t ENGINE=INNODB to 放置表在一个file-per-table tablespace.

    在转换表之前, refer to Section 14.5.4, “Converting Tables from MyISAM to InnoDB”.

    你可以让更高效的存储引擎用于BLOB或者TEXT列的表使用动态行格式:

    File-per-table tablespaces会改善提高 成功恢复和节约时间当一个腐败发生,

    当一个server 不能被重启,或者当备份和binary logs 不可用

    你可以备份或者恢复单个表快速的 使用MySQL 企业备份产品,

    而无需中断其他InnoDB表的使用。这是有意的如果你有表需要不经常的备份或者不同的备份调度

    File-per-table tablespaces是方便的用于每个表的状态报告 当复制或者备份表

    你可以监控表大小在文件系统层面,不需要访问Mysql

    常见的Linux 文件系统不允许并发写一个单独的文件 当innodb_flush_method 是设置为O_DIRECT

    mysql> show variables like ‘%innodb_flush_method%’;
    +———————+——-+
    | Variable_name | Value |
    +———————+——-+
    | innodb_flush_method | |
    +———————+——-+
    1 row in set (0.00 sec)

    因此, 有可能的性能改进当使用 file-per-table tablespaces 。

    system tablespaces 存储数据目录和unod logs,有64TB 大小限制。

    通过比较,每个 file-per-table tablespace 有一个64TB大小的限制,

    这为你提供了增长的空间 。

    File-Per-Table Tablespaces潜在的缺点:

    1. file-per-table tablespaces,每个表可能有没使用的空间,这只能被相同表的记录使用,如果不妥善管理,这可能会

    导致浪费的空间。

    fsync 操作必须运行在每个打开的表 相比一个单位的文件,因为这里有一个单独的fsync 操作对于每个文件,

    写操作在多个表不能被合并成一个单独的I/O操作。 这个可能需要InnoDB 来执行一个fsync操作的较高的数量

    mysqld必须保持一个表打开文件句柄,这个可能会影响性能如果你有大量的表 以 file-per-table tablespaces.

    更多的文件描述符被使用

    innodb_file_per_table 默认是在MySQL 5.6.6或者更高版本启用, 你可以考虑禁用

    如果MySQL 5.5或者5.1是向后兼容是一个问题。禁用 innodb_file_per_table 防止ALTER TABLE 移动InnoDB

    从一个system tablespace 到一个单独的.ibd 文件

    例如, 当重组 InnoDB 表的 clustered index, 表被重建使用当前的设置 innodb_file_per_table

    这种行为不适用于当增加或者删除InnoDB 的 secondary indexes.

    当一个secondary index 是被创建没有rebuild表, index 是存储在相同的文件 作为表数据

    如果很多表在增长,这个潜在的有很多的碎片 会阻碍DROP TABLE和表扫描性能。

    然而,当碎片化被管理, 在自己表空间的文件可以改善性能。

    buffer pool 被扫描 当删除一个 file-per-table tablespace,这可能需要几秒用于Buffer pools

    mysql> show variables like ‘%innodb_autoextend_increment%’;
    +—————————–+——-+
    | Variable_name | Value |
    +—————————–+——-+
    | innodb_autoextend_increment | 64 |
    +—————————–+——-+
    1 row in set (0.00 sec)

    innodb_autoextend_increment 变量, 它定义了增量大小(单位MB) 用于增长大小 共享表空间文件的自动增长, 当表空

    间快满的时候,

    不应用于file-per-table tablespace files, file-per-table tablespace files是自动增长的 有

    innodb_autoextend_increment设置

    14.4.4.1 Enabling and Disabling File-Per-Table Tablespaces 启用和禁用 File-Per-Table Tablespaces

    innodb_file_per_table 选项在MySQL 5.6.6是默认启用的

    设置innodb_file_per_table 选择在启动的时候, 启动serve 带上–innodb_file_per_table 命令行选项,

    或者增加到[mysqld] 章节在my.cnf文件里

    [mysqld]
    innodb_file_per_table=1

    You can also set innodb_file_per_table dynamically, while the server is running:

    SET GLOBAL innodb_file_per_table=1;

    当innodb_file_per_table 启用时, 你可以存储InnoDB 表在一个tbl_name.ibd文件,不像MyISAM 存储引擎,

    有自己独立的tbl_name.MYD和tbl_name.MYI 文件用于indexes和data.

    InnoDB 存储数据和Indexes 一起在.ibd文件。

    如果你禁用 innodb_file_per_table 在你启动选择和重启server, 或者disable 通过SET GLOBAL 命令,

    InnoDB 创建新的表 在system 表空间里。

    你也可以读和写任何的InnoDB 表, 无论file-per-table设置

    移动一个表从system表空间到它自己的表空间,改变innodb_file_per_table设置然后重建表

    SET GLOBAL innodb_file_per_table=1;
    ALTER TABLE table_name ENGINE=InnoDB;

    注意:

    InnoDB 总是需要system 表空间因为它放置它的内部数据字典和Undo logs,

    .ibd 文件不是有效的 对于InnoDB来操作。

  • 相关阅读:
    @bzoj
    @bzoj
    @codeforces
    @codeforces
    @bzoj
    @codeforces
    @codeforces
    @codeforces
    @NOIP2018
    反转字符串--C和Python
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351176.html
Copyright © 2020-2023  润新知