一次MySQL线上浅调优分享

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 一次MySQL线上调优分享,随笔记录一下调优经验。自己对索引下推优化和group by的优化还有待加强。优化前150+ms,优化后30+ms

慢SQL

explain
    SELECT expand.ID 
           expand.CITY_NAME
    FROM expand expand
        LEFT JOIN plan plan ON expand.ID = plan.EXPAND_ID
        LEFT JOIN moment moment ON expand.ID = moment.EXPAND_ID
    WHERE 
      expand.CITY_CODE = '000000'
      AND moment.STATUS = 'PUBLISHED'
      AND plan.STATUS = 'AWAY'
    GROUP BY expand.ID 
    LIMIT 20;

优化前表关键字段声明

表名 字段名字 字段类型 是否是索引
expand ID varchar(44) 主键
expand CITY_CODE varchar(20)
plan EXPAND_ID varchar(44)
plan STATUS varchar(20)
moment EXPAND_ID varchar(64)
moment STATUS varchar(20)

优化前执行计划

image.png
可以看到这是个糟糕的执行计划,目前能肉眼看出的
1.plan走的全表扫描。
2.group by用的临时表和文件排序

第一次优化

由于没做过SQL优化,只能像修计算机主机一样,拆成小单元排除法,来慢慢优化,于是先分析以下SQL的执行计划

explain
    SELECT expand.ID 
           expand.CITY_NAME
    FROM expand expand
        LEFT JOIN plan plan ON expand.ID = plan.EXPAND_ID
        LEFT JOIN moment moment ON expand.ID = moment.EXPAND_ID

image.png

分析:

1.moment表没走索引,因为type是all。
2.plan表也没走索引,PLAN__SEARCH_INDEX是个聚集索引(GARDEN_ID, EXPAND_ID),上面SQL没用到GARDEN_ID,没遵循最左原则,possible_keys,ref也为空,所以断定plan表也没走索引,至于为什么type是index,还不太理解。

优化:

直接给plan表和moment表的EXPAND_ID加上索引

第二次优化

基于第一次优化后,再查询SQL执行计划,如下:

explain
    SELECT expand.ID 
           expand.CITY_NAME
    FROM expand expand
        LEFT JOIN plan plan ON expand.ID = plan.EXPAND_ID
        LEFT JOIN moment moment ON expand.ID = moment.EXPAND_ID

image.png

分析

1.moment和plan都走索引了,type是ref类型,possible_keys,ref也是期望的
2.但是看到Extra,留下了疑问,为什么明明没有用到where关键字,moment表的extra信息显示using where呢?经过查询相关mysql资料,原来是因为moment.EXPAND_ID的字段类型长度和expand.ID的字段类型长度不一致导致的。

优化

修改moment.EXPAND_ID字段长度,保持跟expand.ID字段长度一致

经过二次优化后,执行计划终于是正常的了。Extra信息只显示using index

explain
    SELECT expand.ID 
           expand.CITY_NAME
    FROM expand expand
        LEFT JOIN plan plan ON expand.ID = plan.EXPAND_ID
        LEFT JOIN moment moment ON expand.ID = moment.EXPAND_ID

image.png

第三次优化

经过二次优化后,开始where条件的优化

explain
    SELECT expand.ID 
           expand.CITY_NAME
    FROM expand expand
        LEFT JOIN plan plan ON expand.ID = plan.EXPAND_ID
        LEFT JOIN moment moment ON expand.ID = moment.EXPAND_ID
    WHERE moment.STATUS = 'PUBLISHED'
      AND expand.CITY_CODE = '0000'
      AND plan.STATUS = 'AWAY'

image.png

分析

1.where条件加入plan.status后,执行计划显示plan表不走索引了.
2.expand表的type是eq_ref证明join里用了expand主键,这个没问题。同时也发现CITY_CODE也没走索引
3.moment表显示正常。

优化

1.给plan.status加索引
2.给expand.CITY_CODE加索引

第三次优化完的执行计划
image.png

扩展

1.group by的优化也是个很大的学问,涉及到紧凑索引扫描和松散索引扫描,由于第三次优化的时候误打正着的命中了紧凑索引扫描的逻辑,就顺便把group by用的临时表和文件排序的优化做完了。
2.还搞出了“索引下推”的优化
最后sql执行计划如下:

explain
    SELECT expand.ID 
           expand.CITY_NAME
    FROM expand expand
        LEFT JOIN plan plan ON expand.ID = plan.EXPAND_ID
        LEFT JOIN moment moment ON expand.ID = moment.EXPAND_ID
    WHERE 
      expand.CITY_CODE = '000000'
      AND moment.STATUS = 'PUBLISHED'
      AND plan.STATUS = 'AWAY'
    GROUP BY expand.ID 
    LIMIT 20;

image.png

总结:

1.用索引的时候注意2个字段的类型,注意索引失效的场景
2.group by的时候使用紧凑索引,或者松散索引,不要用临时表+文件排序
3.注意使用索引下推的优化

参考连接:

生产环境上SQL平台的执行时间

优化前

image.png

优化后

image.png

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
11月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
574 66
|
6月前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
6月前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
7月前
|
SQL 负载均衡 关系型数据库
MySQL复制以及调优
本文介绍了MySQL自带复制方案的实现及其注意事项。复制方案能提供数据备份、负载均衡与分布式数据管理的优势。文章详细描述了复制步骤:主库(master)记录更改到二进制日志,发送同步消息给从库(slave),从库接收后将日志复制到本地并执行。实现复制包括配置主库的server-id和二进制日志、创建复制账号、初始化主库数据、设置从库参数及开启复制。此外,还探讨了三种日志格式(row、statement、mixed)的特点及选择建议,并分析了主从复制延迟的优化方法,如控制事务大小、优化日志传输和多线程还原日志等。最后,文中列出了搭建过程中需要注意的关键点。
134 3
|
SQL 算法 关系型数据库
【MySQL】专栏合集,从基础概念到调优
【MySQL】专栏合集,从基础概念到调优
126 0
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
1484 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
11月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
1097 1
|
存储 缓存 关系型数据库
【MySQL调优】如何进行MySQL调优?一篇文章就够了!
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
【MySQL调优】如何进行MySQL调优?一篇文章就够了!
|
关系型数据库 MySQL Java
面试官:说说MySQL调优?
面试官:说说MySQL调优?
200 5
面试官:说说MySQL调优?
|
11月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
979 0

推荐镜像

更多