mysql innodb_file_per_table=1_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 currentinput statement.

mysql>show databases;+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| sys |

+--------------------+

4 rows in set (0.00sec)

mysql> create database tempdb; --为了测试专门建一个库

Query OK, 1 row affected (0.00sec)

mysql> use tempdb; --进入库

Databasechanged

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.00sec)

mysql> create table t(x int , y int); --创建表t

Query OK, 0 rows affected (0.00sec)

mysql> set @@global.innodb_file_per_table=on; --打开innodb_file_per_table

Query OK, 0 rows affected (0.00sec)

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:57db.opt-rw-r-----. 1 mysql mysql 8578 10月 7 09:59t2.frm-rw-r-----. 1 mysql mysql 98304 10月 7 10:00t2.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这样的

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

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

823fd0ac0ff8e678b5cdcf5d3860befd.png

8b4f91d70c4f9fcf0df4994a99320fef.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值