慢查询与MySQL语句优化(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 如果我们了解了Mysql中的索引原理之后,(详见探秘数据库 —— 事务 + InnoDB存储引擎),如何利用索引并对一些执行较慢的sql进行优化也是必要的,所以我们可以结合索引的原理来探究一下慢查询与优化的知识。

如果我们了解了Mysql中的索引原理之后,(详见探秘数据库 —— 事务 + InnoDB存储引擎),如何利用索引并对一些执行较慢的sql进行优化也是必要的,所以我们可以结合索引的原理来探究一下慢查询与优化的知识。


1 慢查询


MySQL的慢查询,全名慢查询日志,


是MySQL提供的一种日志记录,用来记录在MySQL中应时间超过阈值的语句。


默认情况下,MySQL数据库并不启动慢查询,需要手动来设置这个参数。


如果不是调优需要的话,一般不建议启动该参数,开启慢查询日志会或多或少带来一定的性能影响。


慢查询日志可用于查找需要很长时间才能执行的查询,因此是优化的候选者。


查看“慢查询”的配置信息:

SHOW VARIABLES LIKE "%slow%";


20200916093626379.png


查看“慢查询”的时间定义

SHOW VARIABLES LIKE "long_query_time";


2020091609383128.png


设置“慢查询”的时间定义

SET long_query_time = 2;


20200916094002334.png


开启慢日志

SET GLOBAL slow_query_log = "ON";


2 Mysql语句优化


2.1 数据准备


为了做实验,我们需要现在表中插入很多很多条数据,以观察查询时候的性能差异,这里我们插入一千万条数据。


创建表:


CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  `email` varchar(30) DEFAULT NULL,
  `phone` char(11) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;


创建插入1000万条数据的存储过程:


\d //
create procedure p1()
begin
set @i=1;
while @i<=10000000 do
insert into users values(
    null,
    concat('user:',@i),
    concat('user:',@i,'@qq.com'),
    concat('13701',FLOOR(RAND()*500000 + 500000)),
    floor(rand()*100),
    if(floor(rand() * 2) = 1 , '男' , '女')
    );
set @i=@i+1;
end while;
end;
//
\d ;


调用存储过程,完成数据插入

call p1();运行时间会比较久,在我的电脑上是168分钟左右,大家耐心等待哦~~


20200916143225669.png


我们再插入一条特殊的数据:

insert into users values(null,"zhangsan","zhangsan@qq.com",13701383017,25,'女');


查询刚刚插入的数据

select * from users where name = "zhangsan";


20200916152018370.png


可以看出想要查询出这条数据需要的时间非常久,相应的也存储到了慢查询的日志里面了,对应的日志内容如下:


# Time: 200916 15:19:54
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 6.708004  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 10000001
SET timestamp=1600240794;
select * from users where name = "zhangsan";


2.2 EXPLAIN语句


一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划


这个执行计划展示了接下来具体执行查询方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。


MySQL为我们提供了EXPLAIN语句来帮助我们查看某个语句的具体执行计划。


使用EXPLAIN分析SQL语句


20200916152953779.png


对输出结果的参数解释如下,其中重要的已经在上图标明:


id 在一个大的查询语句中每个SELECT关键字都对应一个唯一的id

select type SELECT 关键字对应的那个查询的类型

table 表名

partitions 匹配的分区信息

type 针对单表的访问方法

possible_keys 可能用到的索引

key 实际上使用的索引

key_len 实际使用到的索引长度

ref 当使用索引列等值查询时,与索引列进行等值匹配的对象信息

rows 预估的需要读取的记录条数

filtered 某个表经过搜索条件过滤后剩余记录条数的百分比

Extra 一些额外的信息

当我们换一种方法来查找这一条数据时,比如使用id来查询,由于id默认为主键索引,所以查询速度较快:

20200916153419513.png


只用了0.02秒,explain一下的结果如下,也验证了该理论:


20200916153544954.png



2.3 添加索引


尝试给name字段加普通索引

alter table users add index index_name(name);之后再使用name字段来查询,发现速度提升了不少,原因就在于我们将name字段设置成了索引项:


20200916155148956.png


使用explain查看一下:


20200916155709340.png


大家看到,索引能给数据检索提高的效率非常明显

那么是否意味着我们只要尽可能多的去建立索引就可以了呢?

每建立一个索引都会建立一棵B+树,并且需要维护,这是很费性能和存储空间的。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
4月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
5月前
|
SQL 缓存 关系型数据库
MySQL 慢查询是怎样优化的
本文深入解析了MySQL查询速度变慢的原因及优化策略,涵盖查询缓存、执行流程、SQL优化、执行计划分析(如EXPLAIN)、查询状态查看等内容,帮助开发者快速定位并解决慢查询问题。
218 0
|
5月前
|
SQL 监控 关系型数据库
MySQL慢查询攻略
本文详细介绍了MySQL慢查询优化的全流程,从定位性能瓶颈到具体优化策略,再到高级调优与预防监控。首先通过开启慢查询日志和分析工具(如pt-query-digest)找到问题SQL,接着从索引优化(如最左前缀原则、覆盖索引)、SQL语句重构(如避免全表扫描)及EXPLAIN执行计划解析等方面进行核心优化。随后深入参数调优和架构升级,如调整innodb_buffer_pool_size、实施分库分表等。最后,通过实时监控工具(如PMM、Prometheus+Grafana)建立长效机制,并以电商订单查询为例,展示优化前后性能大幅提升的实战效果。
510 0
|
3月前
|
缓存 关系型数据库 MySQL
降低MySQL高CPU使用率的优化策略。
通过上述方法不断地迭代改进,在实际操作中需要根据具体场景做出相对合理判断。每一步改进都需谨慎评估其变动可能导致其他方面问题,在做任何变动前建议先在测试环境验证其效果后再部署到生产环境中去。
170 6
|
9月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
4月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
122 2
|
4月前
|
存储 SQL 关系型数据库
MySQL 动态分区管理:自动化与优化实践
本文介绍了如何利用 MySQL 的存储过程与事件调度器实现动态分区管理,自动化应对数据增长,提升查询性能与数据管理效率,并详细解析了分区创建、冲突避免及实际应用中的关键注意事项。
176 0
|
6月前
|
存储 SQL 关系型数据库
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
|
8月前
|
存储 关系型数据库 MySQL
MySQL细节优化:关闭大小写敏感功能的方法。
通过这种方法,你就可以成功关闭 MySQL 的大小写敏感功能,让你的数据库操作更加便捷。
640 19
|
9月前
|
关系型数据库 MySQL 数据库
从MySQL优化到脑力健康:技术人与效率的双重提升
聊到效率这个事,大家应该都挺有感触的吧。 不管是技术优化还是个人状态调整,怎么能更快、更省力地完成事情,都是我们每天要琢磨的事。
210 23

推荐镜像

更多