zoukankan      html  css  js  c++  java
  • mysql-5.7 innodb_file_per_table 详解

    一、innodb_file_per_table 的简要说明:

      在很久很久以前也就是说还没有innodb_file_per_table 的那个年代,所有的innodb表的数据都是保存在innodb系统表空间中的,

      在有了innodb_file_per_table参数后innodb可以把每个表的数据单独保存。单独保存有两方面的优势一个是方便管理,二个是提

      长性能。

    二、用一个例子直观的来感受一下innodb_file_per_table的作用:

      创建两个表 t 和t2,在创建t表时innodb_file_per_table=OFF,在创建t2表时innodb_file_per_table=ON,观察两种情况下文件系统

      生成文件的不同

      二.1 第一步建表:

    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql> show databases;                                                                                                         
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.00 sec)
    
    mysql> create database tempdb;      -- 为了测试专门建一个库                                                                                            
    Query OK, 1 row affected (0.00 sec)
    mysql> use tempdb;                  -- 进入库
    Database changed
    mysql> show global variables like 'innodb_file_per_table';  -- 察看当前设置   
    +-----------------------+-------+
    | Variable_name         | Value |
    +-----------------------+-------+
    | innodb_file_per_table | ON    |
    +-----------------------+-------+
    
    mysql> set @@global.innodb_file_per_table=off;              -- 关闭innodb_file_per_table
    Query OK, 0 rows affected (0.00 sec)
    mysql> create table t(x int , y int);                       -- 创建表t                                                                                         
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> set @@global.innodb_file_per_table=on;               -- 打开innodb_file_per_table        
    Query OK, 0 rows affected (0.00 sec)
    mysql> create table t2(x int,y int);                        -- 创建表t2
    Query OK, 0 rows affected (0.01 sec)

      二.2 察看tempdb库中t,t2表所对应的文件:

    [root@cstudio 5.7.19]# ll tempdb/                                                                            
    总用量 124
    -rw-r-----. 1 mysql mysql    61 10月  7 09:57 db.opt
    -rw-r-----. 1 mysql mysql  8578 10月  7 09:59 t2.frm
    -rw-r-----. 1 mysql mysql 98304 10月  7 10:00 t2.ibd
    -rw-r-----. 1 mysql mysql  8578 10月  7 09:59 t.frm

      

      由上面的内容可以看出t表少了一个ibd类型的文件,这个文件主要是用来保存innodb表中的数据的,所以对于t表来说数据就只

      保存在innodb系统表空间文件中了。

    三、mysql 引用innodb_file_per_table是为了解决什么问题:

      在没有innodb_file_per_table之前所有的innodb表的数据都是统一保存到,innodb系统表空间文件中的,如果想让mysql的行为

      与innodb_file_per_table还没有引入时的行为一致,那么把innodb_file_per_table设置为OFF就行。

      1、由于数据都统一保存到innodb系统表空间文件中,在drop table ,truncate table后表空间文件并不会进行收缩,也就是说

      表空间文件所占的磁盘空间并不会因为drop table , truncate table 而释放。

      2、对于mysql来说alter table 的过程大概可以概括为 1)根据alter table 的指示创建出一张新的表 . 2)把老表的数据插入表新表中

      3)删了老表. 4)把新表的表名字重命名成老表的名字;当然如今的mysql已经有inplace对上面的过程进行优化了,不过并不是所有

      的alter table 都支持inplace,更多关于inplace的问题在此不表了。还是回到alter table 的第2)步 由这里可以看出系统表空间是

      要增大的(理由是:创建了新的表,又在向新的表中插入数据) 所以啊alter table 会导致系统表空间的进一步加大。

      3、在linux系统中不允许并行的对一个文件进行写入(innodb_flush_method=O_DIRECT的情况下是这样的),这可能成为一个性能

      问题

      4、对于使用innodb_file_per_table=ON的情况下,默认创建出来的ibd文件的格式是Barracuda,在这个文件格式下innodb数据行

      的格式就可以设置为compressed 或 dynamic 格式了。compressed 提供压缩功能节约空间,dynamic能优化对blob,text这样的

      数据类型的存储以提升性能。

    ----------------------------------------------------------------------

  • 相关阅读:
    June. 26th 2018, Week 26th. Tuesday
    June. 25th 2018, Week 26th. Monday
    June. 24th 2018, Week 26th. Sunday
    June. 23rd 2018, Week 25th. Saturday
    June. 22 2018, Week 25th. Friday
    June. 21 2018, Week 25th. Thursday
    June. 20 2018, Week 25th. Wednesday
    【2018.10.11 C与C++基础】C Preprocessor的功能及缺陷(草稿)
    June.19 2018, Week 25th Tuesday
    June 18. 2018, Week 25th. Monday
  • 原文地址:https://www.cnblogs.com/JiangLe/p/7634292.html
Copyright © 2011-2022 走看看