前面已经写了有两篇章长度的文章,第三篇我一直在寻思着要写什么(其实并无),按照脑图来的话,这篇文章咱们该来说讲关于索引的知识了,这但是 MySQL 性能优化很关键的知识点,千万千万不要错过,不过我这里会相对比较深刻地探究,相信你们读完以后多少会有点收获。php
先送上两张飞机票🛬还没读过前面文章的伙伴能够先前往阅读,由浅入深: MySQL相关(一)- 一条查询语句是如何执行的 MySQL相关(二)- 一条更新语句是如何执行的html
因为索引的知识点比较多,官网的内容也不少,若是你们想详细了解能够到官网,想先通读了解的话能够先看看我对索引的总结,这一章节分为三部分来说:node
前面提到的脑图以下,想要完整高清图片能够到微信个人公众号下【6曦轩】下回复 MySQL 脑图获取: mysql
dev.mysql.com/doc/refman/… dev.mysql.com/doc/refman/…程序员
MySQL 的存储结构分为 5 级:表空间、段、簇、页、行。面试
上一篇文章讲磁盘结构的时候提到过,表空间能够看作是 InnoDB 存储引擎逻辑结构的最高层,全部的数据都存放在表空间中。分为:系统表空间、独占表空间、通用表空间、 临时表空间、Undo 表空间。算法
表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等,段是一个逻辑的概念。一个 ibd 文件(独立表空间文件)里面会由不少个段组成。sql
建立一个索引会建立两个段,一个是索引段:leaf node segment,一个是数据段:non-leaf node segment。索引段管理非叶子节点的数据。数据段管理叶子节点的数据。数据库
也就是说,一个表的段数,就是索引的个数乘以 2。性能优化
一个段(Segment)又由不少的簇(也能够叫区)组成,每一个区的大小是 1MB(64个连续的页)。
每个段至少会有一个簇,一个段所管理的空间大小是无限的,能够一直扩展下去,可是扩展的最小单位就是簇。
为了高效管理物理空间,对簇进一步细分,就获得了页。簇是由连续的页(Page)组成的空间,一个簇中有 64 个连续的页。 (1MB/16KB=64)。这些页面在物理上和逻辑上都是连续的。
跟大多数数据库同样,InnoDB 也有页的概念(也能够称为块),每一个页默认 16KB。
页是 InnoDB 存储引擎磁盘管理的最小单位,经过 innodb_page_size 设置。
一个表空间最多拥有 2^32 个页,默认状况下一个页的大小为 16KB,也就是说一个表空间最多存储 64TB 的数据。
注意,文件系统中,也有页的概念。
操做系统和内存打交道,最小的单位是页 Page。文件系统的内存页一般是 4K。
SHOW VARIABLES LIKE 'innodb_page_size';
复制代码
假设一行数据大小是 1K,那么一个数据页能够放 16 行这样的数据。
举例:一个页放 3 行数据。
往表中插入数据时,若是一个页面已经写完,产生一个新的叶页面。若是一个簇的全部的页面都被用完,会从当前页面所在段新分配一个簇。
若是数据不是连续的,往已经写满的页中插入数据,会致使叶页面分裂:
InnoDB 存储引擎是面向行的(row-oriented),也就是说数据的存放按行进行存放。
Antelope[ˈæntɪləʊp](羚羊)是 InnoDB 内置的文件格式,有两种行格式:
REDUNDANT[rɪˈdʌndənt] Row Format
COMPACT Row Format(5.6 默认)
Barracuda[ˌbærəˈkjuːdə](梭子鱼)是 InnoDB Plugin 支持的文件格式,新增了 两种行格式:
DYNAMIC Row Format(5.7 默认) COMPRESSED Row Format
文件格式 | 行格式 | 描述 |
---|---|---|
Antelope (Innodb-base) | ROW_FORMAT=COMPACT ROW_FORMAT=REDUNDANT | Compact 和 redumdant 的区别在就是在于首部的存 存内容区别。 compact 的存储格式为首部为一个非 NULL 的变长字 段长度列表 redundant 的存储格式为首部是一个字段长度偏移 列表(每一个字段占用的字节长度及其相应的位移)。 在 Antelope 中对于变长字段,低于 768 字节的,不 会进行 overflow page 存储,某些状况下会减小结果 集 IO. |
Barracuda (innodb-plugin) | ROW_FORMAT=DYNAMIC ROW_FORMAT=COMPRESSED | 这二者主要是功能上的区别功能上的。 另外在行 里的变长字段和 Antelope 的区别是只存 20 个字节, 其它的 overflow page 存储。 另外这两都须要开启 innodb_file_per_table=1 |
innodb_file_format 在配置文件中指定;row_format 则在建立数据表时指定。
show variables like "%innodb_file_format%"; SET GLOBAL innodb_file_format=Barracuda;
复制代码
在建立表的时候能够指定行格式。
CREATE TABLE tf1 (c1 INT PRIMARY KEY) ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
复制代码
查看行格式:
SHOW TABLE STATUS LIKE 'student' \G;
复制代码
有问题?能够给我留言或私聊 有收获?那就顺手点个赞呗~
固然,也能够到个人公众号下「6曦轩」,
回复“学习”,便可领取一份 【Java工程师进阶架构师的视频教程】~
回复“面试”,能够得到: 【本人呕心沥血整理的 Java 面试题】
回复“MySQL脑图”,能够得到 【MySQL 知识点梳理高清脑图】
因为我咧,科班出身的程序员,php,Android以及硬件方面都作过,不过最后仍是选择专一于作 Java,因此有啥问题能够到公众号提问讨论(技术情感倾诉均可以哈哈哈),看到的话会尽快回复,但愿能够跟你们共同窗习进步,关于服务端架构,Java 核心知识解析,职业生涯,面试总结等文章会不按期坚持推送输出,欢迎你们关注~~~