- 浏览: 293099 次
文章分类
- 全部博客 (148)
- Shell (2)
- Python (4)
- Java (31)
- Javascript (4)
- Android (7)
- SQL优化 (0)
- Linux (5)
- webOS (4)
- MySQL (18)
- memcach redis (1)
- memcach (0)
- redis (3)
- memcache (2)
- svn (1)
- UED (1)
- 网络 (1)
- virtual box (1)
- git (1)
- Gitosis (1)
- 云计算 (2)
- 12306 (1)
- google (1)
- spdy (1)
- nginx (1)
- tomcat (2)
- SSL (2)
- lucene (2)
- 空间搜索 (1)
- lzo (1)
- 数据压缩 (1)
- ios (1)
- maven (1)
- elasticsearch (1)
- scribe (1)
- flume (1)
- jni (1)
- jna (1)
- hadoop (2)
- 大数据 (1)
最新评论
-
aa80303857:
不错,学习了。互相关注一下。
Sitemesh学习笔记 -
xiaozang:
...
关于nginx的rewrite重写规则 -
coderuncle:
楼主有没有研究过cloudera flume和apache f ...
scribe,flume -
奔跑的犀牛:
...
linux下自动启动mysql -
lsn_1212:
网上装svn的资源太多了,这个挺好的,说的挺全的。
SVN Server安装部署攻略(Linux+SubVersion+Apache)
前言
前一篇文章基于InnoDB存储引擎的mysql数据库文件详解中的数据文件就是本篇文章的表文件。基于InnoDB存储引擎的mysql数据库所有数据都存在这个表文件中,可以叫做表空间。InnoDB存储引擎的表空间由段(segment),区(extent),页(page)组成。
理解一个概念:如果一台运行mysql数据库的服务器内存大小为1G,那么如果你查询大于1G的数据,必挂无疑。像select * from table的数据小于1G那么也会很慢,但是可以查询。mysql数据库把所有的数据传送完之后会存储一部分数据到内存。提供给下次的查询。
InnoDB存储引擎表空间结构图
虽然表空间结构是如上图所示,但是也并不是严格按照上面的结构划分的,比如一个表空间可能由几个段和很多个零散的页组成。
对于innodb文件结构不理解可以查看基于InnoDB存储引擎的mysql数据库文件详解。
段
一个表空间常见的段有数据段,索引段,回滚段。一个段有多个区组成。这里不做详细解释,意义不大。
区
一个区由连续的64个页组成。大小为64*16KB = 1MB。这里不做详细解释,意义不大。
页
一个页由多个行组成,因为是索引组织表,所以一个页最少要有2个行。
页是innoDB存储引擎最小的磁盘空间单位。一个页的大小为固定的16KB。
为什么说页是innodb存储引擎的最小磁盘空间单位?
比如新建一个test空表。如果往里面插入一行只有1KB的数据。那么innodb存储引擎就会从硬盘申请16KB的磁盘空间。虽然里面只有1KB的数据,但是还是会占据16KB的磁盘空间。剩余的15KB是空闲的空间,用于下次插入数据的空间使用。
打开innodb_file_per_table参数。进行下面的测试。
新建一个空表test。
mysql>create table test(id int(10) unsigned auto_increment,name varchar(8000),primary key(id))engine = innodb;
查看新表的大小。
#ls –lh test.ibd;
可以看到使用innodb存储引擎的新建的空表的大小为96KB。也就是96KB/16KB=6个页。也就是说innodb为每个空表分配了6个页大小的空间用。
给name列添加索引。
mysql>create index name on test(name);
在查看表的大小。
#ls –lh test.ibd;
大小变为112KB,增加了112KB-96KB=16KB。也就是说为一个列添加一条索引innodb就会给再申请16KB大小的磁盘空间,也就是1个页大小的空间使用。
删除这个name索引,再看看表空间大小。
表空间的大小又变回96KB。虽然磁盘空间的大小成为96KB,但是这里面还有很多的空间可以用于新数据的存储。下面看看这个96KB大小的空间能够存储多少数据才会增加。
往表里面添加3行数据。大小为3*8000B,也就是3*8000B/1024 = 3*7.8kb = 23.4KB。在查看表空间大小。
mysql>insert test select null,repeat(‘a’,8000);
可以看到还是96KB大小。
再插入一条数据查看大小。
mysql>insert test select null,repeat(‘a’,8000);
表空间大小已经变为128KB了。增加了128KB-96KB=32KB。也就是增加了32KB/16KB=2个页的大小。
就是说空表的96KB大小只能存储 23.4KB大小的数据。再插入数据的表空间大小就会增加了。其实这个大小不是23.4KB,确切的应该是32KB。就是两个页的大小。如果两个页全部用完innodb就会申请更多的空闲页。这里申请了2个空闲页。
基础插入59条数据(为什么插入59条呢?为了证明一个概念,仔细看下面的测试会明白。)。那么数据的总大小为前面的4条+新的59条=63条数据。大小为63*7.8KB = 491.4KB。在查看表空间大小。
可以看到表空间大小变为576KB大小。也就是576KB/16KB=36个页。
这个时候再插入一条数据。查看大小。
奇迹出现,表空间大小变为2M。也就是2*1024KB/16KB = 128个页。为什么呢?
因为innodb在新建一个表的时候会用零散的36个页存储数据,如果数据量大于36页就会开始申请更大的空间存储数据。申请64个连续的页大小的空间。以后随着数据的增加继续申请64个页的空间。
页的结构
File Header | 文件头 | 38个字节 |
Page Header | 页头 | 56个字节 |
Infimun+Supermun Records | 主键最大值,最小值 | 分配剩余的16KB*1024-38B-56B-8B=16282B |
User Records | 记录数据 | 分配16282B |
Free Space | 空闲空间 | 分配16282B |
Page Directory | 页目录 | 分配16282B |
File Trailer | 文件结尾信息 | 8个字节 |
其中文件头,页头,文件结尾信息的大小是固定。其余的会根据数据大小分配剩下空间。
文件头File header组成
名称 | 解释 | 大小 |
FIL_PAGE_SPACE_OR_CHKSUM | 该页数据那个表空间,ibdata文件中插入缓冲页中这个值记录这test.ibd中的test表空间 | 4字节 |
FIL_PAGE_OFFSET | 表空间中页的偏移量 | 4字节 |
FIL_PAGE_PREV | 上一个页的偏移量 | 4字节 |
FIL_PAGE_NEXT | 下一个页的偏移量 | 4字节 |
FIL_PAGE_LSN | 该页最后被修改的日志位置LSN(log sequence number) | 8字节 |
FIL_PAGE_TYPE | 该页存放的数据类型。数据页,索引页等 | 2字节 |
FIL_PAGE_FILE_FLUSH_LSN | 文件至少被更新到了LSN值 | 8字节 |
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID | 页属性属于那个表空间 | 4字节 |
页头Page Header的组成
名称 | 解释 | 大小 |
PAGE_N_DIR_SLOTS | 在页目录(Page Directory)中slot(槽)数 | 2字节 |
PAGE_HEAP_TOP | 堆中第一个记录的指针 | 2字节 |
PAGE_N_HEAP | 堆中的记录数 | 2字节 |
PAGE_FREE | 指向空闲列表的首指针 | 2字节 |
PAGE_GARBAGE | 已删除记录的字节数,就是行记录结构中delete falg为1的记录 | 2字节 |
PAGE_LAST_INSERT | 最后插入记录的位置 | 2字节 |
PAGE_DIRECTION | 最后插入的方向,可能值PAGE_LEFT(0×01),PAGE_RIGHT(0×02) | 2字节 |
PAGE_N_DERECTION | 一个方向连续插入记录的数量 | 2字节 |
PAGE_N_RECS | 该页中记录数 | 2字节 |
PAGE_MAX_TRX_ID | 修改当前页的最大失误ID | 8字节 |
PAGE_LEVEL | 当前页在索引树种的位置,0×00代表叶节点 | 2字节 |
PAGE_INDEX_ID | 当前页属于那个索引 | 8字节 |
PAGE_BTR_SEG_LEAF | B+树的叶节点中,文件段的首页指针位置 | 10字节 |
PAGE_BTR_SEG_TOP | B+树的非叶节点中,文件段的首指针位置 | 10字节 |
Infimun+Supermun Records的组成
这两个是该页的两个边界,infimun记录比该页中任何主键的值都要小。supermun记录比该页中任何可能最大的主键值都要大。
User Records 的组成
存储着所有的行记录内容。
FreeSpace 的组成
就是空闲的空间。
Page Directory 页目录的组成
存放了记录的相对位置。
File Trailer 文件尾的组成
名称 | 解释 | 大小 |
FIL_PAGE_END_LSN | 与FILE_HEADER的FIL_PAGE_LSN值比对,用来检查页的完整性 | 8字节 |
行
InnoDB存储引擎的数据是按照一行一行存储的。每个页里面最多存放16KB大小的行。最小2行,因为是索引组织表。
InnoDB有很多行的记录格式。默认是Compact行记录格式。
Compact行记录格式
变长字段长度列表 | NULL标记位 | 记录头信息 | 列1数据 | 列2数据 | 列3数据 | ………… | 列n数据 |
存储vachar等变长类型的长度 | 记录列中是否有NULL数据 | 关于行的信息记录 | 具体的列 | 具体的列 | 具体的列 | 具体的列 | 具体的列 |
总结
发表评论
-
mysql binlog分析工具
2013-01-26 22:45 1534https://github.com/tangfl/jbinl ... -
MySQL 百万级分页优化(Mysql千万级快速分页)
2012-12-07 22:30 0以下分享一点我的经验 一般刚开始学SQL的时候,会这样写 ... -
mysql共享表空间和独立表空间
2012-12-07 22:12 0innodb表的数据结构 innodb这种引擎 ... -
InnoDB之表空间
2012-12-07 22:12 0innoDB是MySQL的重要存储引擎,为数据提供了很好 ... -
MySQL 系统架构 说明
2012-12-07 22:07 900说明:本文转自 简朝阳(MySQL ACE)的 《MyS ... -
MySQL技术内幕:InnoDB存储引擎读书笔记(下)
2012-12-07 21:58 1356第六章、锁 锁是区别文件系统和数据库系统的一个关键 ... -
MySQL技术内幕:InnoDB存储引擎读书笔记(中)
2012-12-07 21:54 1536第四章、表 4.1 ... -
MySQL技术内幕:InnoDB存储引擎读书笔记(上)
2012-12-07 21:53 1656第一章、mysql体系结构和存储引擎 1.1、数据 ... -
由12306.cn谈谈网站性能技术
2012-10-17 16:35 96512306.cn网站挂了,被 ... -
mysql水平切分
2012-10-17 13:22 1280在大中型项目中,在 ... -
mysql主从复制(半同步方式)
2012-08-15 12:22 3038一、半同步复制原理介 ... -
淘宝开源 mysql 插件,让mysql像nosql一样使用
2012-06-29 17:28 1216http://rdc.taobao.com/team/jm/a ... -
mysql的几个主要分支
2012-06-29 17:11 1367http://www.percona.com/software ... -
mysql 添加用户,并对数据库授权
2011-12-07 11:46 1054use mysql; insert into user ... -
MySQL server has gone away 问题的解决方法
2011-04-11 11:27 10151、应用程序(比如PHP)长时间的执行批量的MYSQL语句。 ... -
DRBD 提升了 MySQL 的集群能力
2011-03-02 23:00 1025前几天 MySQL 站点上 ... -
快速/简单实现mysql数据库集群(mysql cluster)
2011-03-02 22:58 1865最近一直在研究mysql的高可用性和负载均衡技术,对于数据库/ ... -
MySQL复制实现互为主从双机热备
2011-03-02 22:55 1869A B 为两台MySQL服务器,均开启二进制日志,数据库版本 ... -
Mysql, DRBD, Heartbeat 实现数据库复制和数据库系统HA
2011-03-02 22:51 1548使用了两种技术来实现数据库之间的复制和高可用性(HA) DR ... -
Drbd + heartbeat + mysql replication来构建mysql的高可用性
2011-03-02 22:50 1411A(M)[192.168.33.11\192.168.43.1 ...
相关推荐
### MySQL Innodb 索引原理详解 #### 1. 各种树形结构 在深入探讨MySQL Innodb索引之前,我们先了解几种基本的树形数据结构,包括二叉搜索树、B树、B+树以及B*树。...对于理解和优化MySQL数据库的性能至关重要。
在MYSQL中建立任何一张数据表,在其数据目录对应的数据库目录下都有对应表的.frm文件,.frm文件是用来保存每个数据表的元数据(meta)信息,包括表结构的定义等,.frm文件跟数据库存储引擎无关,也就是任何存储引擎的...
### MySQL数据库及索引详解 #### 一、MySQL简介与数据库发展 MySQL是一款非常流行的开源关系型数据库管理系统,由瑞典MySQL AB公司开发。它以其高性能、稳定性和易用性著称,广泛应用于Web应用程序和企业级系统中...
MySQL数据库中,InnoDB存储引擎的索引与存储结构是数据库性能优化的关键,了解这些机制对于数据库管理员和开发人员至关重要。InnoDB是MySQL中支持事务处理的存储引擎,它具有ACID(原子性、一致性、隔离性、持久性)...
### Innodb存储引擎浅析—事务系统 #### 学述 在MySQL的众多存储引擎中,InnoDB无疑是最为重要且被广泛使用的之一。本文旨在深入解析InnoDB存储引擎中的事务处理机制及其背后的设计原理。 #### 存储引擎介绍 在...
MySQL的InnoDB存储引擎是数据库管理中常用的一种存储引擎,尤其在处理大量数据和事务处理方面表现出色。InnoDB存储引擎的索引实现主要依赖于B+树数据结构,这有助于加速数据检索,减少磁盘I/O操作,从而提高查询性能...
### MySQL数据库设计规范详解 #### 一、概述 在当今数据驱动的世界中,数据库的设计与管理至关重要。良好的数据库设计不仅能提升系统的稳定性和可扩展性,还能优化查询性能,确保数据安全。MySQL作为一种广泛使用...
MySQL数据库存储引擎技术详解 随着信息技术的不断进步,数据存储和管理在计算机科学领域内扮演着越来越重要的角色。MySQL作为最流行的开源数据库管理系统之一,它的灵活性和可靠性使得它在各种数据库应用场合中占据...
### MySQL数据库设计与优化知识点详解 #### 一、MySQL数据库设计概述 MySQL作为一种广泛使用的开源关系型数据库管理系统,其设计的好坏直接影响着系统的性能、稳定性和可维护性。因此,合理的数据库设计对于确保...
在本课程设计中,我们将深入探讨MySQL数据库管理系统,这是一个广泛使用的开源关系型数据库系统,尤其在Web应用程序中受到青睐。MySQL以其高效性、可靠性和易用性而闻名,是许多初学者和专业开发者的首选数据库解决...
本文将详细介绍如何在MySQL中配置支持事务的操作以及启用InnoDB存储引擎的方法。 #### 二、InnoDB存储引擎简介 InnoDB是MySQL中默认的存储引擎之一,提供了ACID事务的支持,确保数据的一致性和可靠性。此外,InnoDB...
### MySQL数据库移植问题详解 #### 一、MySQL数据库移植概述 在进行系统迁移或服务器升级的过程中,经常会遇到数据库移植的问题。对于SQL Server等数据库来说,只要版本一致,通常可以直接进行数据库文件的附加...
### MySQL数据库备份方法详解 #### 一、引言 在数据驱动的时代背景下,数据库作为存储企业核心业务数据的重要工具,其稳定性和可靠性至关重要。而为了防止因意外情况导致的数据丢失,进行定期的数据备份就显得尤为...
MySQL作为一款广泛使用的开源关系型数据库管理系统,其InnoDB存储引擎因其高可靠性和事务处理能力而备受青睐。为了充分发挥InnoDB的优势并针对特定场景进行性能优化,合理配置相关的参数至关重要。本文将详细介绍...
- **INNODB_BUFFER_POOL_SIZE的设置**:讨论INNODB_BUFFER_POOL_SIZE参数对InnoDB存储引擎性能的影响。 - **INNODB_FLUSH_LOG_AT_TRX_COMMIT的设置**:介绍INNODB_FLUSH_LOG_AT_TRX_COMMIT参数如何影响事务日志...
- 如果数据库中包含了大量的表结构或数据,可以通过`source`命令执行存储在文件中的SQL语句: ```sql source ; ``` #### 三、技巧与注意事项 1. **单用户模式:** - 对于一些特定的操作,可能需要将数据库...