SQL慢查询与优化

简介: MySQL的慢查询,全名慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中应时间超过阈值的语句。

1.慢查询

MySQL的慢查询,全名慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中应时间超过阈值的语句。
默认情况下,MySQL数据库并不启动慢查询,需要手动来设置这个参数。
如果不是调优需要的话,一般不建议启动该参数,开启慢查询日志会或多或少带来一定的性能影响。
慢查询日志可用于查找需要很长时间才能执行的查询,因此是优化的候选者。

查看“慢查询”的配置信息
SHOW VARIABLES LIKE "%slow%";
image.png

查看“慢查询”的时间定义
SHOW VARIABLES LIKE "long_query_time";
image.png

设置“慢查询”的时间定义
SET long_query_time = 2;
image.png

开启“慢查询”
SET GLOBAL slow_query_log = "ON";

2.Mysql语句优化

2.1EXPLAIN语句
一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划。这个执行计划展示了接下来具体执行查询方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。
MySQL为我们提供了EXPLAIN语句来帮助我们查看某个语句的具体执行计划。
使用EXPLAIN分析SQL语句
image.png

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

  1. id在一个大的查询语句中每个SELECT关键字都对应一个唯一的id
  2. select_type SELECT关键字对应的那个查询的类型
  3. table 表名
  4. type 针对单表的访问方法
  5. possible_keys 可能用到的索引
  6. key 实际上使用的索引
  7. key_len 实际使用到的索引长度
  8. ref 当使用索引列等值查询时,与索引列进行等值匹配的对象信息
  9. rows 预估的需要读取的记录条数
  10. Extra 一些额外信息

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

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

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

使用explain查看一下:
image.png

可以看到,索引能给数据检索提高的效率非常明显
那么是否意味着我们只要尽可能多的去建立索引就可以了呢?
每建立一个索引都会建立一棵B+树,并且需要维护,这是很费性能和存储空间的
2.3适当建立索引

  1. 创建并使用自增数字来建立主键索引
  2. 经常作为where条件的字段建立索引
  3. 添加索引的字段尽可能的保持唯一性
  4. 可考虑使用联合索引并进行索引覆盖

2.4合理使用索引
MySQL索引通常是被用于提高 WHERE 条件的数据行匹配时的搜索速度,在索引的使用过程中,存在一些使用细节和注意事项,因为不合理的使用可能会导致建立了索引之后,不一定就使用上了索引。
2.4.1不要在列上使用函数和进行运算
不要在列上使用函数,将导致索引失效
select * from news where year(publish_time) = 2017;
改造为使用索引
select * from news where publish_time = '2017-01-01';
不要在列上进行运算,也会导致索引失效
select * from news where id / 100 = 1;
image.png
image.png

改造为使用索引
select * from news where id = 100;
2.4.2类型要匹配
当查询条件左右两侧类型不匹配的时候会发生隐式转换,隐式转换带来的影响就是可能导致索引失效而进行全表扫描。
修改一下表中的数据
update users set name = '123456' where id = 10086;
发现如果出现隐式数据类型转换时,查询时间会非常长。
2.4.3首部不出现通配符
当在尾部使用通配符时可以使用索引
image.png

当在头部使用通配符时,会导致索引失效
image.png

2.4.4多个单列索引并不是最佳选择
Mysql只能使用一个索引,会从多个索引中选择一个(限制最严格的)索引,因此,为多个列创建单列索引并不能提高Mysql的查询性能。
使用多个单列索引的情况:
alter table users add index index_name(name);
image.png

看上去很美好,但文件可能会非常的大。
image.png

事实上,MySQL只能使用一个单列索引。这样既浪费了空间,又没有提高性能(因为需要回行)为了提高性能,可以使用复合索引保证列都被索引覆盖。
复合索引:
alter table users add index in_x(email,phone,name);
2.4.5小心复合索引的最左侧原则
查询条件中使用了复合索引的第一个字段,索引才会被使用。因此,在复合索引中索引列的顺序至关重要。如果不是按照索引的最左列开始查找,则无法使用索引。
image.png

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
5月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
2月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
214 6
|
10月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
7月前
|
SQL 存储 自然语言处理
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
|
9月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
10月前
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
486 9
|
11月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
12月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
293 11
|
11月前
|
SQL 分布式计算 Java
Spark SQL向量化执行引擎框架Gluten-Velox在AArch64使能和优化
本文摘自 Arm China的工程师顾煜祺关于“在 Arm 平台上使用 Native 算子库加速 Spark”的分享,主要内容包括以下四个部分: 1.技术背景 2.算子库构成 3.算子操作优化 4.未来工作
1504 0