INNODB存储引擎表空间
这片文章主要是对innodb表空间的一些说明:
innodb中表空间可以分为以下几种:
- 系统表空间
- 独立表空间
- undo表空间
- 临时表空间(temporary tablespace)
- 通用表空间(general tablespace)
系统表空间与独立表空间
表空间可以看做是innodb存储引擎结构的最高层,所有的数据都存放在表空间中。在默认情况下innodb存储引擎有一个共享表空间ibdata1,即所有的数据都存放在这个表空间中。如果启用了innodb_file_per_table参数,则每张表的数据可以单独放到一个表空间。
- 系统表空间(即共享表空间)
系统表空间可以通过参数innodb_data_file_path对其进行配置,默认配置如下:
mysql> show variables like "innodb_data_file_path";
+-----------------------+------------------------+
| Variable_name | Value |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend |
+-----------------------+------------------------+
1 row in set (0.00 sec) #ibdata1:指定默认文件名
#12M:指定默认文件大小
#autoextend: 表示文件是自增的,当超过12M时,会自动增加大小,没有指定表空间的位置,默认是在数据库目录下面的。
采用了默认的表空间,但实际大小如下
mysql> system ls -lh /data/mysql/ibdata1;
-rw-rw---- 1 mysql mysql 76M Oct 16 15:30 /data/mysql/ibdata1
可以通过指定多个文件组成一个表空间,同时设置文件的属性。
#注意添加文件时的格式写法
innodb_data_file_path=ibdata1:100M:autoestend;/data/ibdata2:200M
这里使用了两个文件来组成表空间,若这两个文件位于不同的磁盘上,磁盘的负载可能被平均,因此可以提高数据库的整体性能。
- 独立表空间
如果启用了innodb_file_per_table的参数,则每张表内的数据可以单独放到一个表空间中(tabname.ibd的形式命名)。
需要注意的是: 每张表的表空间内存放的只是数据,索引,和插入缓冲Bitmap页,其他类型的数据,如回滚信息,插入缓冲索引页,系统事务信息,二次写缓冲等,还是存在在原来的系统表空间中。
即便启用了独立表空间,共享表空间还是会不断增大。
即便是执行了rollback撤回了事务,共享表空间的大小也不会变小,虽然innodb存储引擎不会回收这些表空间,但是innodb存储引擎 会自动判断这些undo信息是否还需要,如果不需要则会将这些空间标记为可用空间,供下次使用。
undo表空间
【待续】
临时表空间
临时表空间,即在创建表时使用temporary参数,来创建临时表;
具体创建临时表在这片博客写过https://www.cnblogs.com/wxzhe/p/9767991.html
通用表空间
通用表空间是在MySQL5.7中添加的一个新功能。
可以数据库中指定的某几张表的数据写到同一个表空间,类似于系统的共享存储空间。
创建通用表空间的语法如下:
CREATE TABLESPACE tablespace_name
ADD DATAFILE 'file_name'
[FILE_BLOCK_SIZE = value] #指定通用表空间文件块的大小
[ENGINE [=] engine_name] #指定存储引擎
#创建通用表空间
mysql> create tablespace ts add datafile "ts1.ibd" engine=innodb;
Query OK, 0 rows affected (0.04 sec)
#datafile若是使用绝对路径,则可以指定datadir之外的目录,默认是在datadir指定的目录
#创建的表空间已经存在
mysql> system ls -lh /data/mysql/ts1.ibd
-rw-r----- 1 mysql mysql 64K Oct 23 06:42 /data/mysql/ts1.ibd
绑定表空间,把创建的表的表空间指定到上面创建的通用表空间。
#把多张表指向一个表空间
mysql> create table test1(id int, name varchar(20)) tablespace=ts;
Query OK, 0 rows affected (0.02 sec) mysql> create table test2(id int, name varchar(20)) tablespace=ts;
Query OK, 0 rows affected (0.02 sec) mysql> create table test3(id int, name varchar(20)) tablespace=ts;
Query OK, 0 rows affected (0.01 sec)
#使用show create table 语句可以发现上面三张表的表空间均为ts。
#删除表空间
mysql> create tablespace ts2 add datafile "ts2.ibd" engine=innodb;
Query OK, 0 rows affected (0.01 sec) mysql> drop tablespace ts2;
Query OK, 0 rows affected (0.02 sec)
当表空间的file_block_size大小与innodb_file_size大小不一致的时候,表空间可以使用压缩方式,后面会讲到。
innodb存储引擎结构
从存储引擎的逻辑存储结构上看,所有数据都被逻辑地存放在一个空间中,称之为表空间。表空间又由段,区,页(也可以称为块)组成。
段,区均为逻辑概念,并且段管理由innodb存储引擎内部完成!
B+树的特征,叶子节点存储数据。上面图中表空间包含了数据段(leaf node segment),索引段(Non-leaf node segment),回滚段(rollback segment)!
区是由连续的页(Page)组成的空间,在任何情况下每个区大小都为1MB,为了保证页的连续性,InnoDB存储引擎每次从磁盘一次申请4-5个区。默认情况下,InnoDB存储引擎的页大小为16KB,即一个区中有64个连续的页。 (1MB/16KB=64)
InnoDB1.0.x版本开始引入压缩页,每个页的大小可以通过参数KEY_BLOCK_SIZE设置为2K、4K、8K,因此每个区对应的页尾512、256、128.
默认页的大小是16KB,但是InnpDB1.2.x版本新增了参数innodb_page_size,通过该参数可以将默认页的大小设置为4K、8K,但是页中的数据不是压缩的。(注意这两个参数的区别)
在启用了innodb_file_per_table后,创建的表默认大小是96KB。但区的大小是1M,因此表的大小至少应该为1M?
原因:在每个段开始的时候,先用32个页大小的碎片页来存放数据,在使用完这些页之后才是64个连续页的申请。这样做的目的是,对于一些小表,或者undo段,可以在开始时候申请较少的表空间,节省磁盘的开销。
innodb创建表时的技巧
页是innodb存储引擎磁盘管理的最小单位,页的大小默认是16KB,可以由innodb_page_size参数设置,设置完成后,不可以对其再次进行修改。除非通过mysqldump导入和导出操作来产生新的库。
innoDB存储引擎中,常见的页类型有:
1. 数据页(B-tree Node)
2. undo页(undo Log Page)
3. 系统页 (System Page)
4. 事物数据页 (Transaction System Page)
5. 插入缓冲位图页(Insert Buffer Bitmap)
6. 插入缓冲空闲列表页(Insert Buffer Free List)
7. 未压缩的二进制大对象页(Uncompressed BLOB Page)
8. 压缩的二进制大对象页 (compressed BLOB Page)
数据压缩
上面有提到可以使用key_block_size设置页的大小,对数据进行压缩。(这里的压缩是在innodb_page_size的基础上进行压缩的)
需要注意的是,数据压缩并不是对表中每一行数据进行压缩,而是对每个页进行压缩的。
在说明表空间压缩之前先介绍有关的几个参数
INNODB存储引擎表空间的更多相关文章
- InnoDB存储引擎表的逻辑存储结构
1.索引组织表: 在InnoDB存储引擎中,表都是依照主键顺序组织存放的.这样的存储方式的表称为索引组织表,在innodb存储引擎表中,每张表都有主键.假设创建的时候没有显式定义主键,则Inn ...
- InnoDB存储引擎表的主键
在InnoDB存储引擎中,表是按照主键顺序组织存放的.在InnoDB存储引擎表中,每张表都有主键(primary key),如果在创建表时没有显式地定义主键,则InnoDB存储引擎会按如下方式选择或创 ...
- MySQL 温故而知新--Innodb存储引擎中的锁
近期碰到非常多锁问题.所以攻克了后,细致再去阅读了关于锁的书籍,整理例如以下:1,锁的种类 Innodb存储引擎实现了例如以下2种标准的行级锁: ? 共享锁(S lock),同意事务读取一行数据. ? ...
- (转)Mysql技术内幕InnoDB存储引擎-表&索引算法和锁
表 原文:http://yingminxing.com/mysql%E6%8A%80%E6%9C%AF%E5%86%85%E5%B9%95innodb%E5%AD%98%E5%82%A8%E5%BC% ...
- MySQL技术内幕InnoDB存储引擎(表&索引算法和锁)
表 4.1.innodb存储引擎表类型 innodb表类似oracle的IOT表(索引聚集表-indexorganized table),在innodb表中每张表都会有一个主键,如果在创建表时没有显示 ...
- MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析
文/何登成 导读: 来自网易研究院的MySQL内核技术研究人何登成,把MySQL数据库InnoDB存储引擎的多版本控制(简称:MVCC)实现原理,做了深入的研究与详细的文字图表分析,方便大家理解I ...
- InnoDB存储引擎介绍-(5) Innodb逻辑存储结构
如果创建表时没有显示的定义主键,mysql会按如下方式创建主键: 首先判断表中是否有非空的唯一索引,如果有,则该列为主键. 如果不符合上述条件,存储引擎会自动创建一个6字节大小的指针. 当表中有多个非 ...
- MySQL Innodb Engine --独立表空间参数(innodb_file_per_table)
MySQL中参数innodb_file_per_table决定将表存放于ibdata*的共享表空间还是独立的.ibd文件的独立表空间. ================================ ...
- 《MySQL技术内幕:InnoDB存储引擎(第2版)》书摘
MySQL技术内幕:InnoDB存储引擎(第2版) 姜承尧 第1章 MySQL体系结构和存储引擎 >> 在上述例子中使用了mysqld_safe命令来启动数据库,当然启动MySQL实例的方 ...
随机推荐
- coreseek/sphinx CentOS6.4下安装
一.在CentOS6.4下安装coreseek之前需要预先安装以下软件 1.打开终端 输入 su 获取管理员权限 2.输入命令 yum install make gcc g++ gcc-c++ lib ...
- php学习九:存取器&魔术方法
当声明属性的时候用到了private,那么的话只能本类中才能访问此属性,其他地方无法使用,这个时候需要给外界提供一些方法来使外界访问 方法一:存取器: 可以提供一个public的方法来使外界对类里面的 ...
- flask框架实战项目架构
一.项目架构: 研习了多天flask,今天终于按照标准流程写了一个实验demo,并实现了ORM调用,一起喜欢自己写原生SQL.废话不多说,来看项目文件结构 mysite/ ./config/ defa ...
- EUI组件之BitmapLabel 位图字体
一.制作文图字体文件 使用TextureMerger制作位图字体,具体查看 官方教程. 我们这里制作了一组位图字体. 二.导入位图字体 位图字体素材放入资源配置文件default.res.json 三 ...
- Python - 3.6 学习四
错误.调试和测试 程序运行中,可能会遇到BUG.用户输入异常数据以及其它环境的异常,这些都需要程序猿进行处理.Python提供了一套内置的异常处理机制,供程序猿使用,同时PDB提供了调试代码的功能,除 ...
- 爬虫实战【3】Python-如何将html转化为pdf(PdfKit)
前言 前面我们对博客园的文章进行了爬取,结果比较令人满意,可以一下子下载某个博主的所有文章了.但是,我们获取的只有文章中的文本内容,并且是没有排版的,看起来也比较费劲... 咋么办的?一个比较好的方法 ...
- 用angular中的ng-repeat和ng-show来实现tab选项卡
虽然我们可以用angular中的路由来做tab选项卡,但是那会让我们建立很多的页面来引入,或者建立 <script type="text/ng-template" id=&q ...
- 使用Python创建.sd服务定义文件,实现脚本自动发布ArcGIS服务
借助ArcGIS桌面发布ArcGIS服务是一个很熟悉的过程了,发布服务的前提是需要拥有一个已连接的ArcGIS Server服务站点,经过对mxd进行制图配置,定义服务参数,才能实现服务的发布,那么这 ...
- rbac - 初识
一.rbac 权限组件 1 项目与应用 一个项目,可以有多个应用 一个应用,可以在多个项目下 前提:应用是组件!! 2 什么是权限? 一个包含正则表达式url就是一个权限 who what how - ...
- python并发
并发方式 线程(Thread) 多线程几乎是每一个程序猿在使用每一种语言时都会首先想到用于解决并发的工具(JS程序员请回避),使用多线程可以有效的利用CPU资源(Python例外).然而多线程所带来的 ...