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年最新整理!

全部评论

相关推荐

03-26 13:44
南华大学 Java
在看面经的花生米很野蛮:这种情况下你当然要回答,你也是吗!!!!我超喜欢他的XXXXX
点赞 评论 收藏
分享
评论
点赞
8
分享

创作者周榜

更多
牛客网
牛客企业服务