当前位置:网站首页>Mysql执行原理剖析
Mysql执行原理剖析
2022-07-30 18:16:00 【51CTO】
1.Mysql架构图

2.Mysql查询过程分析
a.客户端将查询发送到MySQL服务器;
b.服务器先检查查询缓存,如果命中,立即返回缓存中的结果;否则进入下一阶段;
c.服务器对SQL进行解析、预处理,再由优化器生成对象的执行计划;
d.MySQL根据优化器生成的执行计划,调用存储引擎API来执行查询;
e.服务器将结果返回给客户端,同时缓存查询结果;
3.执行计划分析与调优(重点)

输出参数说明:
id:
select查询序列号,id相同,执行顺序由上至下;id不同,id值越大优先级越高,越先被执行;
select_type:查询数据的操作类型,有如下:
simple,简单查询,不包括子查询和union;
primary,包含复杂的子查询,最外层查询标记为该值;
subquery,在select活where中包含子查询,被标记为该值;
derived,在from列表中包含的子查询被标记为改值,MySQL会递归这些子查询,将结果保存到临时表;
union,第二个select出现在union之后,被标记为该值;union包含在from的子查询中,外层select被标记为derived;
union result,从union表获取结果的select;
table:显示该行数据是关于哪张表;
partitions:匹配的分区;
type:表的连接类型,其值、性能由高到底排列如下:
system,表中只有一行记录,相当于系统表;
const,通过索引一次命中,匹配一行数据;
eq_ref,唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常用语主键或唯一索引扫描;
ref,非唯一性索引扫描,返回匹配某个单独值的所有行,用于=、<或>操作符带索引的列;
range,只检索给定范围的行,使用一个索引来选择行,一般用于between、<、>;
index,只遍历索引树;
all,全表扫描;
前5种情况都是理想的索引的情况。通常优化至少到range级别,最好能优化到ref。
possible_keys:指出 MySQL 使用哪个索引在该表找到行记录。
如果该值为 NULL,说明没有使用索引,可以建立索引提高性能;
key:显示 MySQL 实际使用的索引。如果为 NULL,则没有使用索引查询;
key_len:表示索引中使用的字节数,通过该列计算查询中使用的索引的长度。
在不损失精确性的情况下,长度越短越好显示的是索引字段的最大长度,并非实际使用长度;
ref:显示该表的索引字段关联了哪张表的哪个字段;
rows:根据表统计信息及选用情况,大致估算出找到所需的记录或所需读取的行数,数值越小越好;
filtered:返回结果的行数占读取行数的百分比,值越大越好;
extra:包含不适合在其他列中显示但十分重要的额外信息。常见的值如下:
using filesort,MySQL会对数据使用一个外部索引排序,而不是按照表内索引顺序进行读取,若出现改值,则应优化SQL语句;
using temporary,使用临时表缓存中间结果,比如,MySQL在对查询结果排序时使用临时表,常见于order by和group by,若出现该值,则应优化SQL;
using index,表示select操作使用了覆盖索引,避免了访问表的数据行;
using where,where子句用于限制哪一行;
using join buffer,使用连接缓存;
distinct,发现第一个匹配后,停止为当前的行组合搜索更多的行;
4.索引使用
4.1 如何高效的使用索引?
a.尽量不要在where 过滤条件中使用函数
例如: 查询当天的订单语句, 错误示例额如下:
select * from sd_order sd where date(sd.documentDate) = curdate()
这样的写法, 因为使用了date这个日期函数, 使得索引就失效了, 比较好的写法如下:
select * from sd_order sd
where sd.createDate BETWEEN CONCAT(CURDATE(), ' 00:00:00') and CONCAT(CURDATE(), ' 23:59:59');
有时候这么写了也未必能使用上索引, 因为可能where 后面还有其他一些条件, 这时候我们可以考虑强制指定执行索引:
select * from sd_order sd
force index(IDX_Order_createDate) -- 强制指定执行索引
where sd.createDate BETWEEN CONCAT(CURDATE(), ' 00:00:00') and CONCAT(CURDATE(), ' 23:59:59')
边栏推荐
- Vulkan与OpenGL对比——Vulkan的全新渲染架构
- Hangzhou electric school game 2 1001 2022 Static Query on Tree (Tree + hash table difference chain subdivision
- LayaBox---TypeScript---基础数据类型
- 今年这情况。。真心推荐专科的工程师升个本!
- Leetcode数据库系列题解合集(持续更新)
- MYSQL(基本篇)——一篇文章带你走进MYSQL的奇妙世界
- OSPF详解(3)
- leetcode-684:冗余连接
- Test the.net text to Speech module System. Researched
- 国轩高科瑞交所上市:募资近7亿美元 为瑞士今年最大融资项目
猜你喜欢

MySQL数据类型

网络基础(二)-Web服务器-简介——WampServer集成服务器软件之Apache+MySQL软件安装流程 & netstat -an之检测计算机的端口是否占用

432.4 FPS 快STDC 2.84倍 | LPS-Net 结合内存、FLOPs、CUDA实现超快语义分割模型

国轩高科瑞交所上市:募资近7亿美元 为瑞士今年最大融资项目

A senior with 13 years of experience in software testing, summed up 5 test employment suggestions....

2022年杭电多校第2场 1001 Static Query on Tree(树链剖分+哈希表差分

Immersive experience iFLYTEK 2022 Consumer Expo "Official Designated Product"

OSPF详解(4)

Pagoda builds PHP adaptive lazy website navigation source code measurement

ESP8266-Arduino编程实例-BMP180气压温度传感器驱动
随机推荐
Informatics Olympiad 1915: [01NOIP Popularization Group] Greatest Common Divisor and Least Common Multiple | Luogu P1029 [NOIP2001 Popularization Group] The problem of the greatest common divisor and
荐书 | 推荐好评如潮的3本数据库书籍
MySQL数据类型
网络基础(三)01-网络的基础概念——URL地址组成之协议、主机地址、路径和参数&127.0.0.1本地回环地址& 查看网址IP地址并访问之ping空格+网址&netstat -anb查看本机占用端口
CMake library search function does not search LD_LIBRARY_PATH
原生js系列
Pagoda builds PHP adaptive lazy website navigation source code measurement
2022鹏城杯web
「Redis应用与深度实践笔记」,深得行业人的心,这还不来看看?
AWS 控制台
【开发者必看】【push kit】推送服务典型问题合集3
你好好想想,你真的需要配置中心吗?
Arranger software FL Studio Chinese version installation tutorial and switching language tutorial
编曲软件FL Studio中文版安装教程及切换语言教程
开源盛宴ApacheCon Asia 2022即将开幕,精彩不容错过!
针不戳,数据库性能优化八大方案。
EMC VPLEX VS2 SPS电池更换详细探讨
JVM诊断命令jcmd介绍
基于b/s架构搭建一个支持多路摄像头的实时处理系统 ---- 使用yolo v5 系列模型
使用postman调接口报Content type ‘text/plain;charset=UTF-8‘ not supported