MySQL的性能优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: MySQL的性能优化思考一个问题:为什么MySQL的查询会慢?思考一下MySQL的执行流程:客户端->服务端->语法解析->生成计划->执行计划->返回结果在MySQL的整个执行流程中,一条SQL的整体响应时间包括但不限于以下时间网络I/O传输时间CPU计算时间计划统计时间、计划执行时间锁的互斥等待时间操作系统上下文切换时间、系统调用时间操作系统内存不足的I/O时间......等等对于SQL的优化,无论是什么数据库都是基于以上的方面进行优化优化思路:数据库是否检索了大量不需要的数据(如行、列)增加了大量I/O,CPU的计算,内存资源,网络开销查询了不需要的

MySQL的性能优化

  • 思考一个问题:为什么MySQL的查询会慢?
  • 思考一下MySQL的执行流程:
  • 客户端->服务端->语法解析->生成计划->执行计划->返回结果
  • 在MySQL的整个执行流程中,一条SQL的整体响应时间包括但不限于以下时间
  1. 网络I/O传输时间
  2. CPU计算时间
  3. 计划统计时间、计划执行时间
  4. 锁的互斥等待时间
  5. 操作系统上下文切换时间、系统调用时间
  6. 操作系统内存不足的I/O时间
  7. ......等等

对于SQL的优化,无论是什么数据库都是基于以上的方面进行优化

  • 优化思路:
  1. 数据库是否检索了大量不需要的数据(如行、列)
  • 增加了大量I/O,CPU的计算,内存资源,网络开销
  • 查询了不需要的记录(使用limit优化)
  • 返回列的数目过多(指定返回的列名,而不使用*)
  • 查询了重复的数据(适当使用缓存)
  1. 数据库是否分析、计算了大量不需要的数据
  • 从响应时间、扫描行数、返回行数三者衡量
  • 响应时间:避免I/O等待、锁等待
  • 扫描行数与返回行数:避免从大量数据中检索出极少的数据(explain分析)
  • 扫描行数与访问类型:避免访问一行的数据代价过高(explain分析)
  1. 对于以上的优化方式有三种
  • 使用覆盖索引(减少回表次数)
  • 改变表结构(减少无用连接)
  • 重写复杂的SQL语句(能够让优化器优化)
  • 查询语句的优化
  • 明确一点:MySQL对于连接的建立、关闭十分的轻
  • 一个人做事很难办,那就多带几个人干(分而治之)
  • 分片查询;比如说按照时间分片检索,而不是一次性检索全部
  • SQL分解;比如将大部分JOIN的查询,分解为几条简单的查询
  • SQL执行的流程
  • 如图:
  • MySQL的通信协议是半双工的;这意味着在一个时间点只能发或者收
  • 因此,为了防止数据过多导致客户端等待过久,一般采用分页(limit)
  • 如果说MySQL认为SQL合法,就会由优化器将SQL转化为不同的执行计划
  • MySQL的优化器大部分情况是基于成本进行评估的(全文搜索是个例外)
  • MySQL优化器能够处理以下情况的优化
  • 重新定义表的连接顺序(优先选择代价最小的执行计划)
  • 外连接转化为内连接
  • 代数转换变换规则(5=5 and a<5)会变成(a<5)
  • 优化COUNT(),MIN(),MAX();
  • 如MIN()将直接指向B-Tree最左边,MAX()将指向B-Tree最右边;时间复杂度为常数级
  • 预估并且转化为常数表达式(不理解?)
  • 覆盖索引扫描(索引列包含查询中需要使用的列)
  • 子查询优化
  • 提前终止查询(limit,当满足条件时、或者不满足一个条件时)
  • 等值传播(指一个列的条件能够传递到另一个列)
  • IN()与OR的比较;IN()通过二分查找O(logN),OR普通遍历O(N)
  • 排序优化
  • 排序成本极高,避免对大数据进行排序
  • 当不能使用索引排序时,(MySQL会进行排序,小数据时在内存(排序缓冲区),大数据时先分块在排序最后合并)(file sort)
  • 两次传输排序:读取行指针以及待排序列先进行排序,然后根据结果读取数据行(在第二个阶段会产生大量的随机I/O,因为第一个阶段使得不在数据有序)
  • 一次传输排序:先读取全部数据,然后在进行排序;这种方式会消耗等多的排序缓冲区,产生更多次数的分块、合并操作
  • 对于特定函数的优化
  • COUNT():返回包含NULL的行数;(**所有的优化前提是COUNT()不包含任何的GROUP BY,WHERE)
  • 优化措施:innodb会使用最小的非聚簇索引降低成本
  • 优化措施:innodb会认为COUNT(*)是统计行数,而跳过所有列匹配
  • 优化措施:MyISAM将所有的行数目记录下来了,直接返回;MyISAM采用表级锁,不会出现数据一致性问题,而innodb采用行级锁,会产生一致性问题,所以不能采用计数策略
  • COUNT(COLUMN NAME):这是统计某个列的值不为空的数目
  • 性能比较:COUNT(*)优于COUNT(COLUMN NAME)
  • 连接查询的优化
  • 对于JOIN ON或者JOIN USING而言,尽量保证参与计算的列都包含索引,且GROUP BY以及ORDER BY都只涉及一个列
  • limit offset优化
  • 尽可能使用覆盖索引扫描,而不是扫描所有的行(如下:)
  • 通过检索索引在不访问行的情况下检索更少的数据

-- 普通写法

select id, name

from user

order by id

limit 50,5;

-- 优化写法

select id, name

from user

        inner join

    (select id, name

     from user

     order by id

     limit 50,5) as userT using (id);

  • 使用UNION ALL替换UNION
  • 如果对数据没有去重需求,则一般使用UNION ALL,因为UNION会为临时表添加DISTINCT选项
  • UNION:去重
  • UNION ALL:不去重
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
存储 关系型数据库 MySQL
《MySQL 简易速速上手小册》第3章:性能优化策略(2024 最新版)
《MySQL 简易速速上手小册》第3章:性能优化策略(2024 最新版)
60 2
|
3月前
|
存储 缓存 关系型数据库
16. mysql的性能优化
优化MySQL性能主要从设计、功能和架构三方面入手。选择适合的存储引擎(如MyIsam用于高读写,InnoDB处理事务),选取恰当的字段类型(如使用char for定长字符串,tinyint for有限状态),并遵循数据库范式设计。功能上,利用索引优化查询,使用缓存减少数据库负担,并进行分库分表。在架构上,实施主从复制、读写分离和负载均衡来提升性能。
33 0
|
3月前
|
存储 监控 关系型数据库
轻松入门Mysql:MySQL性能优化与监控,解锁进销存系统的潜力(23)
轻松入门Mysql:MySQL性能优化与监控,解锁进销存系统的潜力(23)
|
2月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第三篇(MySQL性能优化)
MySQL数据库进阶第三篇(MySQL性能优化)
|
3月前
|
SQL 缓存 关系型数据库
mysql性能优化-慢查询分析、优化索引和配置
mysql性能优化-慢查询分析、优化索引和配置
189 1
|
10天前
|
存储 关系型数据库 MySQL
"深入探索MySQL临时表:性能优化利器,数据处理的灵活之选"
【8月更文挑战第9天】MySQL临时表专为存储临时数据设计,自动创建与删除,仅在当前会话中存在,有助于性能优化。它分为本地临时表和全局临时表(通过特定逻辑模拟)。创建语法类似于普通表,但加TEMPORARY或TEMP关键字。适用于性能优化、数据预处理和复杂查询,需注意内存占用和事务支持问题。合理使用可大幅提升查询效率。
21 2
|
29天前
|
SQL 存储 数据库
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
|
3月前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
|
2月前
|
SQL 关系型数据库 MySQL
MySQL性能优化实战:从索引策略到查询优化
MySQL性能优化聚焦索引策略和查询优化。创建索引如`CREATE INDEX idx_user_id ON users(user_id)`可加速检索;复合索引考虑字段顺序,如`idx_name ON users(last_name, first_name)`。使用`EXPLAIN`分析查询效率,避免全表扫描和大量`OFFSET`。通过子查询优化分页,如LIMIT配合内部排序。定期审查和调整策略以提升响应速度和降低资源消耗。【6月更文挑战第22天】
250 2
|
2月前
|
存储 关系型数据库 MySQL
深入探索MySQL:成本模型解析与查询性能优化
深入探索MySQL:成本模型解析与查询性能优化