《MySQL 是怎样运行的:从根儿上理解 MySQL》第五节:从一条记录说起——InnoDB记录结构

准备工作

现在只知道客户端发送请求并等待服务器返回结果。
    MySQL什么方式来访问这些数据?
    MySQL服务器上负责对表数据的读取和写入工作的部分是存储引擎。
    什么格式存放?
    真实的数据在不同存储引擎中存放的格式一般是不同的。

InnoDB页简介

InnoDB将数据划分为若干个页,以页作为磁盘和内存的交互的基本单位,InnoDB也的大小一般为16KB。

InnoDB行格式

InnoDB存储引擎有四种不用类型的行个格式,Compact、Redundant、Dynamic和Compressed行格式
    指定行格式的语法
        CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称
        ALTER TABLE 表名 ROW_FORMAT=行格式名称
        案例:
            CREATE TABLE record_format_demo (
                  c1 VARCHAR(10),
                  c2 VARCHAR(10) NOT NULL,
                  c3 CHAR(10),
                  c4 VARCHAR(10)
            )CHARSET=ASCII ROW_FORMAT=COMPACT;
    COMPACT行格式
        一行记录包含
            记录的额外信息
                变长字段长度列表:
                    记录每个变长列数据占用的字节长度,倒叙存放。
                    WML记录,还要再学习。
                    可以不需要,比如:表的每个列都不是变长的数据类型就没有。
                NULL值列表:
                    首先统计允许从存储NULL的列,主键列、被NOT NULL修饰的列不可以存储NULL值。
                    表中么有允许NULL值的列,NULL值列表也就不存在了。
                    允许存储NULL的列对应一个二进制位。
                        二进制位的值为1,表示该列值为NULL。
                        二进制位的值为0,表示该列值不为NULL。
                    二进制位按照逆序排列,第一个列和最后一个二进制位对应。
                    MySQL规定NULL值列表必须用整数个字节位表示,如果使用的二进制位不是整数个字节,则在高位补0
                记录头信息:
                    五个固定字节组成,其他后面学习。
            记录的真实数据
                隐藏列,除了真实数据MySQL还会添加三个隐藏列。
                    row_id:可选。在没有主键,也没有定义unique键的列,InnoDB才会为表添加。
                    transaction_id:必选,事物ID
                    roll_pointer:必选,回滚指针
                数据列
                    非变成字段,没存储地方,空格字符填充。
                    存储为null的列,在前面的NULL值列表中有存储,不会再记录,节省空间。
        CHAR(M)列的存储格式
            列采用定长字符集,该列占用的字节数不会被加到变长字段长度列表,
            如果采用变长字符集时,该列占用的字节数也会被加到变长字段长度列表。
            用字符集最大的字节占空间,防止后面修改数据需要的空间变大而重新分配空间导致碎片。
    Redundant行格式:MySQL5.0以前的一种行格式(没多看 略)
        一行记录包含
            记录的额外信息
                字段长度偏移列表
                    没有变长,说明会记录所有的列(包括隐藏列)。
                    偏移:表示它是采用两个相邻值的差值来计算各个列值的长度。
                记录头信息
                    
            记录真实数据

行溢出数据,不太理解,后面再学习一次。

VARCHAR(M)最多能存储的数据?
            计算方式不太理解,后面再学习一次。
        记录数据太多产生的溢出
            一个页的大小一般是16kb,也就是16384字节,可能一行记录超过16384个字节。

作者总结

1.页是MySQL中磁盘和内存交互的基本单位,也是MySQL是管理存储空间的基本单位。
    2.指定修改行格式的语法如下:
        CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称
        ALTER TABLE 表名 ROW_FORMAT=行格式名称
    3.InnoDB现在定义了4种行格式
        一个也一般是16KB,当记录中的数据太多,当前也放不下的时候,会把多余的数据存储到其他页中,称为行溢出。

脑图地址:方便有需要的同学高清看
http://naotu.baidu.com/file/a0133241fae5042adac6387c7a2a4a7b?token=fb9dfd8fefbdc019

第五节:从一条记录说起——InnoDB记录结构的更多相关文章

  1. 风炫安全WEB安全学习第二十五节课 利用XSS键盘记录

    风炫安全WEB安全学习第二十五节课 利用XSS键盘记录 XSS键盘记录 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源.所以xyz.com下的js脚本采用a ...

  2. 第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框

    第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框 首先安装DjangoUeditor3模块 Ueditor HTML编辑器是百度开源的HTML编辑器 下载 ...

  3. centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课

    centos  Linux系统日常管理2  tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课 ...

  4. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  5. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  6. 第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询

    第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询 1.elasticsearch(搜索引擎)的查询 elasticsearch是功能 ...

  7. centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节课

    centos  lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress  安装phpmyadmin  定时备份mysql两种方法  第二十五节 ...

  8. 第九节: 利用RemoteScheduler实现Sheduler的远程控制 第八节: Quartz.Net五大构件之SimpleThreadPool及其四种配置方案 第六节: 六类Calander处理六种不同的时间场景 第五节: Quartz.Net五大构件之Trigger的四大触发类 第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联

    第九节: 利用RemoteScheduler实现Sheduler的远程控制   一. RemoteScheduler远程控制 1. 背景: 在A服务器上部署了一个Scheduler,我们想在B服务器上 ...

  9. CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第五节

    原文链接 第五节:了解和使用共享内存(2) Rob Farber 是西北太平洋国家实验室(Pacific Northwest National Laboratory)的高级科研人员.他在多个国家级的实 ...

随机推荐

  1. 使用vue进行国际化

    相对于网站等一些需求 我们有需要做国际化的需求,具体步骤如下: 首先安装 vue-i18n npm install vue-i18n import VueI18n from 'vue-i18n' Vu ...

  2. SpringBoot 在IDEA中实现热部署(实用版)

    转自https://www.jianshu.com/p/f658fed35786 具体步骤 一.开启IDEA的自动编译(静态) 具体步骤:打开顶部工具栏 File -> Settings -&g ...

  3. Keyguard分析

      从Android 6.0开始,位于frameworks/bases/packages/Keyguard的Keyguard开始被编译为一个jar包,被SystemUI静态导入,相当于SystemUI ...

  4. ht-4 hashmap特性

    一.hashmap底层原理: hashmap调用默认构造方法会产生一个默认底层是长度为16的Entry数组,首先调用key的hasCode()方法来得到一个整数, int hash = hash(ke ...

  5. 当 Messaging 遇上 Jepsen

    分布式系统面临的挑战 Is it better to be alive and wrong or right and dead? 随着计算机技术的发展,系统架构从集中式演进到分布式.分布式系统相对于单 ...

  6. php接受post传值的方法

    这段时间在研究php的接口,利用jmeter模拟发送数据给php服务器,看php如何接收post传输过去的数据,遇到了几个问题,经过一番度娘之后终于有所理解,记录一下: 这里记录常用的两种post方式 ...

  7. 关于富文本复制word,里面掺杂图片上传的问题

    图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码目前限chrome浏览器使用首先以um-editor的二进制流保存为例:打开umeditor.js,找到UM ...

  8. 删除c++项目中的类

    关闭引擎和vs 在工程目录中删除Source文件夹下相应的cpp和h文件 删除工程目录的saved 文件夹和intermediate文件夹 删除工程目录中binaries文件夹内的所有内容 右键工程文 ...

  9. 晋江年下文爬取【xpath】

    ''' @Modify Time @Author 目标:晋江年下文 爬取6页 ------------ ------- http://www.jjwxc.net/search.php?kw=%C4%E ...

  10. [CSP-S模拟测试]:Equation(数学+树状数组)

    题目描述 有一棵$n$个点的以$1$为根的树,以及$n$个整数变量$x_i$.树上$i$的父亲是$f_i$,每条边$(i,f_i)$有一个权值$w_i$,表示一个方程$x_i+x_{f_i}=w_i$ ...