【MySQL】慢SQL优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 慢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 *情况,按需查询





相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
11天前
|
SQL 关系型数据库 MySQL
MySQL慢查询优化、索引优化、以及表等优化详解
本文详细介绍了MySQL优化方案,包括索引优化、SQL慢查询优化和数据库表优化,帮助提升数据库性能。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
MySQL慢查询优化、索引优化、以及表等优化详解
|
10天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
19天前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
68 10
|
16天前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
44 3
|
18天前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
18天前
|
缓存 关系型数据库 MySQL
如何优化 MySQL 数据库的性能?
【10月更文挑战第28天】
43 1
|
20天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
95 1
|
21天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
49 0
|
22天前
|
SQL 关系型数据库 MySQL
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
34 0
|
22天前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
31 0
下一篇
无影云桌面