0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

剖析MySQL InnoDB存储原理(上)

jf_78858299 来源:老李说架构之道 作者:梦海飞翔 2023-02-15 15:45 次阅读

一、MySQL记录的存储结构:

1、Page的结构,如下图:

图片

1.1 页头

记录页面的控制信息,共占56字节,包括页的左右兄弟页面指针、页面空间使用情况等。

1.2 虚记录

最大虚记录:比页内最大主键还大

最小虚记录:比页内最小主键还小

1.3 记录堆

行记录存储区,分为有效记录和已删除记录

1.4 自由空间链表

已删除记录组成的链表

1.5 未分配空间

页面未使用的存储空间;

2、Page页内记录的维护

2.1 顺序保证

逻辑连续,如图所示:

图片

2.2 插入策略

为了提高内存的利用率,减少内存碎片化空洞,首先从自由空间链表中分配(已删除的记录链表),如果空间不够再从未分配空间分配;

2.3 页内查询

二分查找,首先从物理连续的solt(0~n)中查找所在的solt位,然后再从page逻辑链表中找到所对应的记录;如图所示;

图片

3、Page页内数据特性

3.1 PageSize的固定大小为16KB

3.2 每页至少两天记录,单行最大为8KB

3.3 最多存储10个大字段

数据段最大768 ->(768+20)*10<8K

超出部分存储在溢出页

3.4 VARCHAR

1或2个字节描述字符长度;

实际内容存储在长度字节之后;

VARCHAR(255) [一个字节]+内容

VARCHAR(256) [两个字节]+内容

二、 InnoDB索引原理和优化

1、索引的原理分析

1.1 聚簇索引

数据存储在主键索引中,数据按主键顺序存储,如图所示:

图片

1.2 二级索引

除主键索引以外的索引,叶子中存储主键值

一次查询需要走两遍查询

主键大小会影响所有索引的大小,如图所示:

图片

1.3 联合索引

Key由多个字段组成,最左匹配原则

一个索引只创建一棵树按第一列排序

第一列相同按第二列排序

注意 :如果不是按照最左开始查找,无法使用索引,不能跳过中间列,某列使用范围查询后面的列不能使用索引。

2、索引的优化分析

2.1 存储空间

索引文件大小是由字段大小、页内节点数目、树的层数

2.2 主键的选择

自增主键,顺序写入,效率高

随机主键,结点分裂、数据移动

自增主键写入磁盘利用率高,每次查询走两级索引

随机主键写入磁盘利用率低,每次查询走两级索引

业务主键:写入查询磁盘利用率都高,可以使用一级索引

联合主键:影响索引大小,不易维护,不建议使用

2.3 联合主键

按索引区分度排序,并且覆盖索引;

2.4 字符串索引

字符是按照字节对比的,设置的时候注意控制长度;

不支持开头的%模糊查询,只能全表扫描;

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储
    +关注

    关注

    12

    文章

    3863

    浏览量

    84696
  • MySQL
    +关注

    关注

    1

    文章

    776

    浏览量

    26014
收藏 人收藏

    评论

    相关推荐

    深度剖析MySQL/InnoDB的并发控制和加锁技术

    本文主要是针对MySQL/InnoDB的并发控制和加锁技术做一个比较深入的剖析,并且对其中涉及到的重要的概念,如多版本并发控制(MVCC),脏读(dirty read),幻读(phantom
    的头像 发表于 10-29 14:36 1930次阅读
    深度<b class='flag-5'>剖析</b><b class='flag-5'>MySQL</b>/<b class='flag-5'>InnoDB</b>的并发控制和加锁技术

    详解Mysql数据库InnoDB存储引擎事务

    关于Mysql数据库InnoDB存储引擎事务的一点理解
    发表于 05-13 10:11

    InnoDB锁的特点和状态查询

    MySQL探秘(五)InnoDB锁的类型和状态查询
    发表于 08-07 11:45

    分布式MySQLInnoDB cluster

    分布式MySQL——InnoDB cluster和性能测试
    发表于 04-15 08:43

    MySQL存储引擎简析

    MySQL存储引擎InnoDB  InnoDB存储文件有两个,后缀名分别是.frm和.idb,其中.frm是表的定义文件,而.idb是数
    发表于 09-06 06:07

    MySQL存储引擎中MyISAM与InnoDB优劣势比较分析

    使用MySQL当然会接触到MySQL存储引擎,在新建数据库和新建数据表的时候都会看到。
    的头像 发表于 07-18 16:00 2519次阅读
    <b class='flag-5'>MySQL</b><b class='flag-5'>存储</b>引擎中MyISAM与<b class='flag-5'>InnoDB</b>优劣势比较分析

    MySQL存储引擎中MyISAM与InnoDB优劣势比较分析

    使用MySQL当然会接触到MySQL存储引擎,在新建数据库和新建数据表的时候都会看到。
    的头像 发表于 07-18 16:00 3419次阅读
    <b class='flag-5'>MySQL</b><b class='flag-5'>存储</b>引擎中MyISAM与<b class='flag-5'>InnoDB</b>优劣势比较分析

    关于mysql存储引擎你知道多少

    Mysql中用的最多的两种存储引擎就是MyISAM和InnDB,其中MyISAM是5.1版本之前的默认存储引擎,InnoDB是5.1版本之后的默认
    发表于 08-23 10:52 737次阅读

    最有用的mysql问答

    、压缩、空间函数等,但是不支持事务和行级锁,所以一般用于有大量查询少量插入的场景来使用,而且myisam不支持外键,并且索引和数据是分开存储的。 innodb是基于聚簇索引建立的,和myisam相反它支持事务、外键,并且通过MVCC来支持高并发,索引和数据
    的头像 发表于 09-30 17:43 1524次阅读
    最有用的<b class='flag-5'>mysql</b>问答

    关于InnoDB的内存结构及原理详解

    除此之外还聊了一下MySQLInnoDB的日志,和两次写,总的来说算是一个入门级别的介绍,这篇文章就来详细介绍一下InnoDB的内存结构。
    的头像 发表于 04-16 16:15 2580次阅读
    关于<b class='flag-5'>InnoDB</b>的内存结构及原理详解

    MySQL中的redo log是什么

    前言 说到MySQL,有两块日志一定绕不开,一个是InnoDB存储引擎的redo log(重做日志),另一个是MySQL Servce层的 binlog(归档日志)。 只要是数据更新操
    的头像 发表于 09-14 09:40 1796次阅读

    innodb究竟是如何存数据的

    前言如果你使用过mysql数据库,对它的存储引擎:innodb,一定不会感到陌生。 众所周知,在mysql5以前,默认的存储引擎是:mysl
    的头像 发表于 10-09 15:41 1166次阅读
    <b class='flag-5'>innodb</b>究竟是如何存数据的

    MySQL5.6 InnoDB支持全文检索

    在早期的 MySQL 中,InnoDB 并不支持全文检索技术,从 MySQL 5.6 开始,InnoDB 开始支持全文检索。
    的头像 发表于 11-12 15:14 1017次阅读

    剖析MySQL InnoDB存储原理(下)

    一、InnoDB存储引擎内存管理 1.1 概念: Buffer Pool:预分配的内存池; Page:Buffer Pool的最小单位; Free list:空闲Page组成的链表;
    的头像 发表于 02-15 15:47 284次阅读
    <b class='flag-5'>剖析</b><b class='flag-5'>MySQL</b> <b class='flag-5'>InnoDB</b><b class='flag-5'>存储</b>原理(下)

    MySQL中的InnoDB是什么?

    有许多强大的MySQL存储引擎可供我们使用,而InnoDB无疑是最受欢迎的存储引擎之一。它高度可靠和高效,因此它成为5.5版本以后所有MySQL
    的头像 发表于 04-13 09:09 516次阅读