数据库优化|青训营笔记

63 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 20 天

主要内容:了解sql的执行机制,熟悉sql的优化方法。

1、一条sql查询语句执行过程

  • 连接器:建立TCP连接,校验身份,用户授权
  • 查询缓存,如果查询语句命中查询缓存直接返回,mysql8.0已经删除。
  • 解析SQL:词法分析、语法分析。构建语法树。
  • 执行SQL:预处理阶段,把*扩展成需要字段。优化阶段,选择查询成本最小的执行计划。执行阶段,从存储引擎读取数据。返回给客户端。

2、一行记录是如何存储的

段、区、页、行。一般一条数据存在一行中(溢出情况除外)。页是InnoDB基本的读写单位。

  • 如果表中有变长字段:那么就会有变长字段长度列表,反向依次存储字段的大小
  • 如果表中有可以为null字段:那么就会有NULL值字段,反向依次存储这些字段是否为null,一位标识一个字段,1表示为nil,0表示非nil。如果不够一个字节那就高位补零,(我觉得这也是反向存储的原因,不然不清楚高位到底是不是nil)。
  • 记录头信息:标识是否软删除,下一条记录的地址,该条记录类型
  • row_id:如果没有指定主键或者唯一约束列,那么就需要它,6字节。相当于我们建表的时候自动给的一个主键。
  • trx_id: 标识这条记录时哪个事务生成的。
  • roll_pointer: 记录上一个版本的指针。

一行的最大存储字节就是页的大小,16 KB.如果存储的数据大于这些,就会发生行溢出。那么会拿出20 KB 来指向接下来数据的位置。

1、什么是索引,分类

索引就是数据的目录

  • 按「数据结构」分类:B+tree索引、Hash索引、Full-text索引
  • 按「物理存储」分类:聚簇索引(主键索引)、二级索引(辅助索引)
  • 按「字段特性」分类:主键索引、唯一索引、普通索引、前缀索引
  • 按「字段个数」分类:单列索引、联合索引

联合索引什么时候失效?

联合索引的最左匹配原则,在遇到范围查询(如 >、<)的时候,就会停止匹配,也就是范围查询的字段可以用到联合索引,但是在范围查询字段的后面的字段无法用到联合索引。注意,对于 >=、<=、BETWEEN、like 前缀匹配的范围查询,并不会停止匹配

2、为什么使用B+树

mysql为什么使用B+树,使用数据结构是存储数据的,我们需要知道我们要对数据进行哪些操作。mysql的数据是存在磁盘中的,读写速度相比内存慢很多,所以当我们查询数据的时候我们希望的是尽可能少的磁盘I/O,同时我们还需要进行范围查询,增删数据也是经常做的。

所以我们需要一个数据结构实现以下功能

  • 高效的查询数据,尽可能减少磁盘I/O
  • 能够进行范围查询
  • 高效的增删改数据

二叉树:随着数据量的增加,二叉树高度越来越高,磁盘I/O过多。

B树:非叶子节点也存储数据,想比与B+树,同样数据量情况下高度更高,磁盘I/O次数更多。B+树的叶子节点通过双向链表连接,适合范围查找。B树却不行。

Hash:在等值查找时效率很高,但是无法进行范围查找。

B+树:B+树的高度很低,即使是千万级的数据仍然只需要三四层就可以实现。磁盘I/O次数少。叶子节点通过双向链表连接,适合进行范围查询。节点是有冗余的,删除和插入数据都比较方便,树的整体结构不需要大的改动。插入和删除效率高。