MySQL之七:SQL 语句的常规优化

一、InnoDB索引基本结构

1.1 基本知识点

在这里插入图片描述

1.2 示意图

1.2.1 单页结构

在这里插入图片描述

叶子页
叶子页结构中,key为索引列值value为要使用索引查找的值(也就是说,叶子节点中存放了实际的数据value的位置存放的是非索引key列的列值,对于聚集索引value存放的是表的数据行记录,对于辅助索引value存放的是聚集索引的key值
在这里插入图片描述
非叶子页
非叶子页的结构中,记录的内容相当于是索引key的索引数据(也就是说,非叶子节点中不包含实际的数据,key部分存放的不是实际的key列值,而是key列的一个范围边界值value的位置存放的是指向其他非叶子页或叶子页的指针

1.2.2 单页详细结构

在这里插入图片描述

1.2.3 单层BTREE结构

在这里插入图片描述

单层BTREE结构
完整的单层BTREE结构示意图如上( 每一个页在FIL 头中都包含了 “previous page” and “next page指针,这些指针用于在同层级的页之间形成双向链接列表,从图中我们可以看到,每个页之间都包含了两个方向的箭头指针,在单层结构的BTREE中,可以根据双向链表指针从左往右查找页

1.2.4 多层BTREE结构

在这里插入图片描述

多层BTREE结构
完整的多层BTREE结构示意图如上(这是一个三层结构BTREE,可以看到只有leaf 叶子节点页中存在value值root根节点页和internal中间层页中只有key值范围),在多层结构的BTREE中,可以根据非叶子节点中存放的页指针和页之间的双向链表指针共同确定需要查找的页,以减少访问不必要的页(尤其是在范围查询中,可以通过双向链表横向查找页,而不需要频繁地回到根页从头开始查找)

1.2.5 聚集索引和辅助索引结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2.6 多列索引结构

在这里插入图片描述

多列索引结构
类比:order by c1,c2,c3;因此,按照索引顺序,如果在查询语句的where条件中,索引前面的列缺失,或者前面的列使用了范围值,则后面的索引列无法用于检索数据,只能用于过滤数据

二、SQL 语句执行的基本原理

2.1 执行流程

在这里插入图片描述

2.2 执行流程示意图

在这里插入图片描述

2.3 索引查找流程

MySQL内部利用索引来查找数据的流程,大致包含3个子流程

  • Index Key :该子流程用于确定查询语句需要扫描的数据范围,实际对应的就是查询语句可以利用到的MySQL索引部分,并按照确定的数据范围进行数据查找
  • Index Filter:该子流程用于确定查询语句执行过程中哪些数据可以用索引来过滤,即,在启用查询优化器的ICP特性且在执行查询时能够使用该特性时,该子流程用于确定可以使用索引过滤的部分,并执行索引过滤
  • Table Filter:该子流程用于当MySQL无法用索引过滤时回表取回行数据后,到server层进行数据过滤
    在这里插入图片描述

三、如何快速查看执行计划

3.1 概述

在这里插入图片描述

3.2 select_type字段

在这里插入图片描述

3.3 type字段

在这里插入图片描述
在这里插入图片描述

3.4 extra字段

在这里插入图片描述

四、SQL 语句的常规优化方法

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

great-wind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值