Mysql+innodb数据存储逻辑
Mysql+innodb数据存储逻辑。
表空间由段,区,页组成
ibdata1:共享表空间。即所有的数据都存放在这个表空间内。如果用户启用了innodb_file_per_table,则每张表内的数据可以单独放到一个表空间内。(只是数据,索引和插入缓冲Bitmap页面。其他数据还是放到共享表中。)
段
表空间是由各个段组成,有数据段,索引段,回滚段等。数据与索引段都是用B+树数据结构。
区
是由连续页组成的空间,在任何情况下每个区的大小都是1M,每个区由64个连续的大小为16K的页组成。当然64个这个数目也是要以改变的。但区的大小1M是不能变的,当用记启用了参数innodb_file_per_table后创建的表大小默认为96K。前提是先用32个页大小的碎片页后。再申请64个连续页。充分利用碎片页提高存储效率。但会牺牲查找效率。
页
innodb默认每个大小为16K,1.2.X版本后可以设置>innodb_page_size将页大小设置为4K,8K,16K。
常见的页类型有
- 数据页
- undo页
- 系统页
- 事务数据页
- 插入缓冲位图页
- 插入缓冲空闲列表页
- 未压缩的二进制大对象页(blog)
- 压缩的二进制大对照页(blog)
行
页是由n行组成的,这个抽象跟现实生活中的书本的页是一样的。所以数据的记录格式是也是行格式。
mysql有compact和redundant两种格式来存放。mysql 5.1默认compact。行与行之前用链表结构连接起来,redundant主要是用偏移量还确定数据的顺序。
行溢出问题:当行的数据超过16K页的大小,就是溢出。varchar由于数据库不一样,页的大小也不一样的。oracle是varchar2是4000字节,mssql的varchar是8000,mysql的varchar是65532字节。数据库是这样处理的:将溢出的类型数据放到blog页中。问题来了。
数据页的大小16K。即16384字节。为什么varchar可以存储65532字节呢?
mysql是这样处理的:装溢出的数据放到4个未压缩blog中。4*16384=65535。将减去3位指针位就是65532。
总结举一反三
计算机所有的存储结构不外乎:数组,链表,哈希表,树,或是几种组合使用。
如:hashmap是哈希表,1.8后链表那块改成树减少了时间复杂度。内存管理,磁盘管理,编译器的语法树等。
建议非计算机专业的可以看看《数据结构》。很多代码的核心原理在里面都可以找到。
Mysql+innodb数据存储逻辑的更多相关文章
- (转)MySQL 常用数据存储引擎区别
MySQL 常用数据存储引擎区别 原文:https://laravel-china.org/articles/4198/mysql-common-data-storage-engine mysql有多 ...
- Ubuntu上更改MySQL数据库数据存储目录
之前写过一篇博客"MySQL更改数据库数据存储目录",当时的测试环境是RHEL和CentOS,谁想最近在Ubuntu下面更改MySQL数据库数据存储目录时遇到了之前未遇到的问题,之 ...
- Nutch的配置(使用MySQL作为数据存储)
首先先从http://www.apache.org/dyn/closer.cgi/nutch/下载安装包 这里假定nutch的根目录为:${APACHE_NUTCH_HOME} 配置${APACHE_ ...
- InnoDB数据存储结构
MySQL服务器上 存储引擎 负责对表中数据的读取和写入工作,不同存储引擎中 存放的格式 一般是不同的,甚至有的存储引擎(Memory)不用磁盘来存储数据. 页 (Page) 是磁盘和内存之间交互的基 ...
- MySQL 的数据存储引擎
MySQL的存储引擎 InnoDB: MySQL5.5之后的默认存储引擎. 采用MVCC来支持高并发,并且实现了四个标准的隔离级别(默认可重复读). 支持事务,支持外键.支持行锁.非锁定读(默认读取操 ...
- MySQL 常用数据存储引擎区别
mysql有多种存储引擎,目前常用的是 MyISAM 和 InnoDB 这两个引擎,除了这两个引擎以为还有许多其他引擎,有官方的,也有一些公司自己研发的.这篇文章主要简单概述一下常用常见的 MySQL ...
- MySQL之数据存储引擎
1.什么是存储引擎: 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处 理文本用txt类型,处理表格用excel,处理图片用png等,数据库中的表也应该有不同的 ...
- mysql更改数据存储目录
具体操作请参考文章 1.http://blog.csdn.net/aaronbai/article/details/1431190 更改数据存储目录时候会出现 ERROR 2002 (HY000): ...
- Ubuntu 安装mysql & 自定义数据存储目录
一.安装 apt-get install mysql-server 执行过程如下: root@duke:~# apt-get install mysql-server 正在读取软件包列表... 完成 ...
随机推荐
- Linux查询系统信息命令
Linux查看系统信息是比较基础的知识,所以这个应该都需要掌握,命令和解释如下: #uname -a 查看操作系统.内核.CPU信息 #head -n 1 /etc/issue ...
- 编写高质量代码改善C#程序的157个建议——建议118:使用SecureString保存密钥等机密字符串
建议118:使用SecureString保存密钥等机密字符串 托管代码中的字符串是一类特殊的对象,它们不可用被改变.每次使用System.String类张的方法之一时,或者使用此类型进行运算时(如赋值 ...
- 编写高质量代码改善C#程序的157个建议——建议75:警惕线程不会立即启动
建议75:警惕线程不会立即启动 现代的大多数操作系统都不是一个实时的操作系统,Windows系统也是如此.所以,不能奢望我们的线程能够立即启动.Windows内部会实现特殊的算法以进行线程之间的调度, ...
- ThinkJS 中的Logic层
第一个为什么需要Logic层: 当在 Action 里处理用户的请求时,经常要先获取用户提交过来的数据,然后对其校验,如果校验没问题后才能进行后续的操作:当参数校验完成后,有时候还要进行权限判断等,这 ...
- Javascript事件触发顺序
html标签是有子和父的,这个时候就出现了事件触发顺序的问题,比如: <!DOCTYPE html> <html> <head> <style> .fi ...
- Linq转换操作之OfType,Cast,AsEnumerable,ToLookup源码分析
Linq转换操作之OfType,Cast,AsEnumerable,ToLookup源码分析 一:Tolookup 1. 从方法的注解上可以看到,ToLookup也是一个k,v的形式,那么问题来了,它 ...
- Tomcat负载均衡原理详解及配置(Apache2.2.19+Tomcat7.0.12)
结构图 JAVA项目一般直接用Tomcat作为Web服务器.为了增加tomcat的性能和稳定性,我们一般采用balance和session同步机制. 下图列出了我们常用也是最简单的解决方案. 说明 1 ...
- ZKEACMS 自定义表单的使用
ZKEACMS Core 2.2 已经发布了,其中主要添加了自定义表单的功能.使用自定义表单的功能,您可以在几分钟内就创建一个表单,并用它来收集一些信息.导出收集的信息,就可以做一些统计分析. 创建表 ...
- 对Java意义重大的7个性能指标
本文中,小编搜集了7个最有影响的衡量标注,让你可以不依赖日志文件来了解应用程序现在,让我们看看这些性能指标,并了解如何查看并收集它们.: 一,响应时间和吞吐量 根据应用程序的响应时间可以知道程序完 ...
- Elasticsearch 5.4.1 安装简易文档
1. 系统安装JDK 1.8.0_131或以上版本的JDK 2. 创建软件安装目录 # mkdir -p /opt/software3. 创建elk用户,新版的ELK不在支持使用root账户运行程序, ...