持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情
大家好! 我是慕歌,一只想教你学习 后端技术的野生coder! 欢迎来到慕歌的数据库系列教程,希望通过这个教程带大家深入学习数据库技术,该教程所有知识点均来源于本人的日常学习与开发中,如有疑问请与我联系!
前言
上一节的分享中,慕歌向大家分享关于数据库索引底层原理的知识,从每一种数据结构的底层原理,分析数据索引的选择。在MYSQL数据库中大多数数据存储引擎都选择了使用B+树,作为索引的底层实现,那么B+树这样的结构具有怎样的结构优势呢?
从二叉树到平衡树,以至于B树等结构已经能够在极大程度上加速查询的效率,但由于数据的特殊性,仍然具有一定的优化空间。B+树在保证底层数据的有序,双向链表的链接机制以及索引目录的生成,为数据的范围查询,有序查询提供了最佳的性能。hash 数据结构由于不支持范围性的查询,而被大多数数据存储引擎放弃,但不否认其也是高效的数据查询方式之一。
以上就是为索引底层数据结构特点的简单回顾,理解这些优秀的数据结构以及特性,能为我们在数据表的设计以及优化提供一些思考。这一节我们需要通过检测真实的执行策略,查看语句的真实执行,从中寻找优化点。
性能分析
概述:
如何对数据的查询效率进行量化的考虑,一条语句的执行流程是怎样的,其中发挥的时间以及磁盘的IO需要重点考量,这便是性能分析的作用。
日志分析:
慢查询日志:
慢日志中记录了在MYSQL执行过程中,响应时间超过阈值的语句,这里的long_query_time 可进行调节,默认10s。超过10s仍然未得到响应的语句将会进入慢查询日志中,对其中的语句分析可得到慢查询的部分原因。
日志设置:
#开启慢日志
set global slow_query_log=`ON`;
#日志启动情况
show variables like `%slow_query_log%`;
#阈值修改为1s
set global long_query_time = 1;
#查询设置阈值
show global variables like '%long_query_time%';
日志查询:
#日志记录数
SHOW GLOBAL STATUS LIKE '%Slow_queries%';
#慢日志分析
#得到返回记录集最多的10个SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log
#得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/atguigu-slow.log
执行成本分析:
#查看开启状态
show variables like 'profiling';
#开启
set profiling = 'ON';
#查看所有执行的语句
show profiles;
#分析其中某条语句的执行成本
show profile cpu,block io for query 2;
执行计划分析:
explain:
#explain 使用
EXPLAIN SELECT select_options
#或者
DESCRIBE SELECT select_options
结果集中各列的含义:
- id:查询语句的关键字的唯一id
- select-type:对应查询的类型
- table:表名
- partition:匹配的分区信息
- type:单表的访问方法
- key:使用的索引
- key_len:索引的长度
- ref:索引匹配的对象信息
- rows:预估的数据的条数
- extra:其他建议信息
关键字段:
table:无论单表还是多表查询在执行层面都会进行单表的查询
id:标识一条select 语句,id 一致可认为是一条select 语句
type:标识的性能,数据库的预估:
system》const》eq_ref》ref》fulltext》range》index》all
在range或者ref 层次具有较好的性能
rows:预估的需要使用的数据条数
结语
这一节的分享到这里就结束了,下一节将带来数据库优化的分享学习!
如果您觉得本文不错,欢迎点赞支持,您的关注是我坚持的动力!