【MySQL】慢SQL优化

简介: 慢SQL优化老生常谈了,今天聊一下优化时遇到的几个坑点。

MySQL系列文章

分析SQL

搜集sql

image.png

  • 按平均耗时倒序排序,取前10个进行优化

查看执行计划

  • 通过explain查看sql执行计划


关键字

解释

table

表名

type

连接的数据类型,由好到差const、eq_ref、ref、range、index、all

const表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次

eq_ref对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。

ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。

range:只检索给定范围的行,使用一个索引来选择行。

index:该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小

all:对于每个来自于先前的表的行组合,进行完整的表扫描。

rows

估算扫描行数

extra

using index condition:搜索条件中虽然出现了索引列,但是有部分条件无法使用索引,会根据能用索引的条件先搜索一遍再匹配无法使用索引的条件。

key

适用的索引

image.png

  • 主要注意几个地方
  • key:执行器选择的索引
  • rows:估算的扫描数据行数


缺少索引

看完执行计划之后判断是否缺少索引就很明朗了,直接看explain语句返回结果的key,如果为空则说明没有走索引。


创建索引要本着以结合where条件区分度最高的原则创建,考虑以下几个方面

联合索引最左匹配原则

  • 最左前缀匹配:mysql会一直向右匹配直到遇到范围查询
  • 联合索引结合索引结构推断,索引会在范围查询断掉
  • 最左优先,在检索数据时从联合索引的最左边开始匹配
  • 遇到范围查询(>、<、between、like)比较就会停止
  • 举例:
  • 创建一个 index_magor_class(magor,class) 的联合索引,那么它的索引树就是下图的样子
  • 我们查询的where 条件如果只传入了班级,是走不到联合索引的,但是如果只传了学院编号,是可能会走到联合索引的。(为什么说可能,MYSQL的执行计划和查询的实际执行过程并不完全吻合,比如你数据库数据量很少,可能直接全量遍历速度更快,就不走索引了)

索引覆盖

  • 结合业务场景适当考虑索引覆盖
  • 普通的索引查询步骤为,现根据索引定位到主键,再根据主键去查找数据行(回表操作)
  • 指查询列在索引列中,不需要回表操作


索引失效

  • 时间类型data_format会导致时间字段索引失效
  • 可以用date(ctime) < str_to_date('2019-12-30', '%Y-%m-%d')
  • 对索引字段使用计算操作或函数失效,类似&运算等
  • 使用like %key%使索引失效,大数据量全文检索尽量使用es
  • or关键字前后没有同时使用索引
  • 联合索引最左匹配原则顺序不符合规则
  • 索引字段使用is null 或 is not null
  • join语句字段编码不一致导致引擎走错索引
  • case when不走索引


业务分析

深度分页

  • 尽量在产品层上规避掉此类需求,比如操作日志,除了出大问题谁会看自己几月前甚至几年前的操作。
  • 规避不了的话就要考虑深度分页方案
  • limit n, m; n代表偏移量通常在业务系统需要page_no * page_size如果偏移量很大如何优化
  • 参考es的深度分页策略,滚动分页。利用id连续返回上次查询的最大记录(偏移量),基于上一次查询偏移量作为where条件
  • 业务中限制页数
  • 先通过索引列拿到主键,通过主键回表查详情
select a.*from emp a,(select id from emp limit1000000,10) b where a.id= b.id


是否需要select *

  • 查询字段会占用网络带宽,也会拖慢sql执行,所以尽量避免select *情况,按需查询





相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
780 152
|
2月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
205 6
|
3月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
3月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
3月前
|
SQL 监控 关系型数据库
查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
以上步骤提供了直观、实用且易于理解且执行的指导方针来监管和优化数据库服务器配置。务必记得,在做任何重要变更前备份相关配置文件,并确保理解每个参数对系统性能可能产生影响后再做出调节。
400 11
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
3月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
160 3
|
3月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
4月前
|
存储 运维 关系型数据库
从MySQL到云数据库,数据库迁移真的有必要吗?
本文探讨了企业在业务增长背景下,是否应从 MySQL 迁移至云数据库的决策问题。分析了 MySQL 的优势与瓶颈,对比了云数据库在存储计算分离、自动化运维、多负载支持等方面的优势,并提出判断迁移必要性的五个关键问题及实施路径,帮助企业理性决策并落地迁移方案。
|
3月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。