博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql-5.7 innodb_file_per_table 详解
阅读量:6878 次
发布时间:2019-06-26

本文共 3198 字,大约阅读时间需要 10 分钟。

一、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 changedmysql> 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_tableQuery 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);                        -- 创建表t2Query 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这样的

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

 

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

转载于:https://www.cnblogs.com/JiangLe/p/7634292.html

你可能感兴趣的文章
一个强大的人民币大写转换的正则表达式
查看>>
MySQL索引背后的数据结构及算法原理zz
查看>>
用代码实现Sharepoint2010的个人信息的照片上传(原创)
查看>>
MF前传——探索者一号简介
查看>>
HDU 3681 Prison Break
查看>>
Spring-模板方法模式及Callback
查看>>
牛刀小试:使用Reactive Extensions(Rx),一行代码实现多线程任务执行规定时间后自动停止...
查看>>
addslashes与mysql_real_escape_string的区别
查看>>
[译]XPath和CSS选择器
查看>>
X皮书之shell热身
查看>>
js实现HTML标题栏中新消息提示效果
查看>>
【转】mac的lanchpad重复出现图标的解决方法
查看>>
STAR法则
查看>>
sprintf介绍
查看>>
java学习:weblogic下JNDI及JDBC连接测试(weblogic环境)
查看>>
python invoke super parent method
查看>>
[LeetCode] Binary Tree Maximum Path Sum
查看>>
获取HTML源码(只取文字,判断编码,过滤标签)
查看>>
我的架构经验系列文章 - 后端架构 - 设计层面
查看>>
vc生成静态库例子
查看>>