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数据存储逻辑的更多相关文章

  1. (转)MySQL 常用数据存储引擎区别

    MySQL 常用数据存储引擎区别 原文:https://laravel-china.org/articles/4198/mysql-common-data-storage-engine mysql有多 ...

  2. Ubuntu上更改MySQL数据库数据存储目录

    之前写过一篇博客"MySQL更改数据库数据存储目录",当时的测试环境是RHEL和CentOS,谁想最近在Ubuntu下面更改MySQL数据库数据存储目录时遇到了之前未遇到的问题,之 ...

  3. Nutch的配置(使用MySQL作为数据存储)

    首先先从http://www.apache.org/dyn/closer.cgi/nutch/下载安装包 这里假定nutch的根目录为:${APACHE_NUTCH_HOME} 配置${APACHE_ ...

  4. InnoDB数据存储结构

    MySQL服务器上 存储引擎 负责对表中数据的读取和写入工作,不同存储引擎中 存放的格式 一般是不同的,甚至有的存储引擎(Memory)不用磁盘来存储数据. 页 (Page) 是磁盘和内存之间交互的基 ...

  5. MySQL 的数据存储引擎

    MySQL的存储引擎 InnoDB: MySQL5.5之后的默认存储引擎. 采用MVCC来支持高并发,并且实现了四个标准的隔离级别(默认可重复读). 支持事务,支持外键.支持行锁.非锁定读(默认读取操 ...

  6. MySQL 常用数据存储引擎区别

    mysql有多种存储引擎,目前常用的是 MyISAM 和 InnoDB 这两个引擎,除了这两个引擎以为还有许多其他引擎,有官方的,也有一些公司自己研发的.这篇文章主要简单概述一下常用常见的 MySQL ...

  7. MySQL之数据存储引擎

    1.什么是存储引擎: 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处 理文本用txt类型,处理表格用excel,处理图片用png等,数据库中的表也应该有不同的 ...

  8. mysql更改数据存储目录

    具体操作请参考文章 1.http://blog.csdn.net/aaronbai/article/details/1431190 更改数据存储目录时候会出现 ERROR 2002 (HY000): ...

  9. Ubuntu 安装mysql & 自定义数据存储目录

    一.安装 apt-get install mysql-server 执行过程如下: root@duke:~# apt-get install mysql-server 正在读取软件包列表... 完成 ...

随机推荐

  1. javascript总结19:javascript 使用概述

    1 JS作用 1.验证表单(以前的网速慢)`` 2.页面特效(PC端的网页效果) 3.移动端(移动web和app) 4.异步和服务器交互(AJAX) 5.服务端开发(nodejs) 2 浏览器的主要构 ...

  2. SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本)

    一.spring cloud简介 鉴于<史上最简单的Spring Cloud教程>很受读者欢迎,再次我特意升级了一下版本,目前支持的版本为Spring Boot版本2.0.3.RELEAS ...

  3. ViewResolver 视图解析器

    pringMVC 视图解析器 前言 在前一篇博客中讲了 SpringMVC 的Controller 控制器,在这篇博客中将接着介绍一下 SpringMVC 视图解析器.当我们对SpringMVC控制的 ...

  4. mybatis-初步使用

    最近因为业务各方面的原因,需要使用mybatis,所以系统的学习和总结下. 其实mybatis出来已经很久了,貌似大家伙用得也挺顺手的样纸,好歹我先不评价,还是先了解了解mybatis的样纸,后续再添 ...

  5. 通用性站点管理后台(Bee OPOA Platform) (5)- 【扩展】基于WebSocket的监视Sql执行功能

    开始 底层的东西总是很类似, 看了园里的Fish-Li的一系列文章, 写得真好, 无论是风格还是内容. 本来也想想方便点就用remoting实现监视功能算了, 但这样就需要一个Winform的项目了. ...

  6. httpWebRequest请求错误,基础连接已经关闭: 连接被意外关闭

    win10下,C# 用httpWebRequest 执行post请求出现"请求错误,基础连接已经关闭: 连接被意外关闭",经测试设置 //Post请求方式 System.Net.H ...

  7. vim 在 cmdline 内粘贴的方法

    vim 在 cmdline 内粘贴的方法: 先按下 Ctrl-r ,然后选择从哪个剪贴板上粘贴 0 (yank register), 1 to 9 (shifting delete registers ...

  8. [Winter Vacation] 语文实词虚词练习册答案

    下载通道: [120个文言文实词小故事] [18个文言文虚词小故事] 120个文言文实词小故事 爱   楚人爱(宠爱)其子,虽爱(吝惜)钱财,于其子之求而无不应.其子成人,有陶氏之风独爱(喜爱)菊,众 ...

  9. 二,php的错误处理

    php处理错误的三种方式: 简单的die()语句: 自定义错误和错误触发器:错误日志: 1,简单的die()语句 if(!file_exists("aaa.txt")){ die( ...

  10. jquery加载方式,选择器,样式操作

    原生js和css不兼容,jquery已经过测试,可放心使用 https://code.jquery.com   这个网站可以下载jquery的源码,比如把源码下载到js文件夹中,文件名为jquery- ...