MySQL(上)
1. InnoDB存储结构
- InnoDB一个页的大小
- InnoDB行格式(四种)
COMPACT
变长字段占用字节数排序及原因
NULL值列表:逆序二进制位对应
真实数据添加主要列:row_id、trx_id、roll_pointer
CHAR(M)类型存储:编码实际存储长度,变长列表记录
REDUNDANT(非紧凑)
变长列表替换为字段长度偏移列表(每个字段)
NULL值会在偏移量中使用一个位标识
DYNAMIC
COMPRESSED
2. InnoDB数据页结构
- 页大小、页类型、存储数据的页
- 页主要参数
每条数据主要参数
next_record
按照主键大小的下一条记录
在记录的位置,对应变长列表的顺序
删除的数据之间可以形成垃圾链表
Infimum、SupreMum
User Records
槽
Infimum槽只有一个元素、SupreMum槽1~8个,中间槽4~8
槽裂:满8,裂成前4后5
日志序列号LSN(redo log)
页面内单向链表
- 页面间:双向链表
3. B+树索引结构
- InnoDB
二级索引
只存索引列+主键+页号
回表:二级索引中根据主键信息到聚簇索引中重新定位完整数据的过程
联合索引排序:第一列绝对顺序,后续是在上一列下相对有序
二级索引相当于该索引与主键构成的联合索引
唯一二级索引也会包含主键值
页
区别目录页和数据页,段、record_type字段:0数据、1目录
页内定位数据:槽可加速,链表遍历
页的PAGE_LEVEL字段是页节点在B+树中的层级,0是叶子
页面都有一个页面编号,如果连续,代表物理磁盘连续
一个B+树索引根节点创建后页号不变
规定一个页至少存放2条记录
聚簇索引即数据
非叶子节点
也会存在双向链表
- MyISAM
单独存放在数据文件,没有数据页
索引信息单独存放到另一个文件
索引存储(二级索引)、主键、行号组合
MyISAM的索引全是二级索引
MyISAM回表速度快,因为直接存储数据的地址偏移量
4. B+树索引使用
- 查询匹配过程
- 索引的代价
空间代价
一个索引需要维护一个B+树
时间代价
页面分裂、页面回收、节点维护
- 索引条件下推
- 索引排序
如果在order by子句中使用了索引列,可省去磁盘或内存排序步骤
正常情况下在service层(内存)或者磁盘上排序
联合索引:order by 后的顺序必须按照联合索引顺序
不能使用索引排序情况:
联合索引字段间ACS、DESC混用
order by 中包含不同索引的列
orderby联合索引不符合最左匹配
排序列不是独立的列名出现在order by中
- 索引用于分组
- 回表代价
- 如何更好创建索引
只为用于where、order by、和group by的字段建立索引
考虑索引列中不重复值的比例
索引列的类型尽量小
建立前缀索引
覆盖索引(避免使用select *)
索索条件中以单独列名出现
5. InnoDB的表空间
- 群里面的一张图
6. 单表访问方法
- 查询优化器的工作
- 访问方法的概念
const
ref
ref_or_null
range
index
all
- 索引和并
Intersection:交集
Union:并集
Sort-Union合并
7
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
涵盖各大厂考官最爱问知识点,22年最新整理!