MySQL的性能优化

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 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
目录
相关文章
|
8天前
|
存储 缓存 负载均衡
mysql的性能优化
在数据库设计中,应选择合适的存储引擎(如MyISAM或InnoDB)、字段类型(如char、varchar、tinyint),并遵循范式(1NF、2NF、3NF)。功能上,可以通过索引优化、缓存和分库分表来提升性能。架构上,采用主从复制、读写分离和负载均衡可进一步提高系统稳定性和扩展性。
28 9
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第三篇(MySQL性能优化)
MySQL数据库进阶第三篇(MySQL性能优化)
|
2月前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
541 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
27天前
|
存储 关系型数据库 MySQL
MySQL性能优化实践指南
【10月更文挑战第16天】MySQL性能优化实践指南
41 0
|
27天前
|
存储 关系型数据库 MySQL
MySQL性能优化指南
【10月更文挑战第16天】MySQL性能优化指南
35 0
|
2月前
|
存储 关系型数据库 MySQL
mysql-性能优化(一)
mysql-性能优化(一)
|
2月前
|
关系型数据库 MySQL 数据处理
针对MySQL亿级数据的高效插入策略与性能优化技巧
在处理MySQL亿级数据的高效插入和性能优化时,以上提到的策略和技巧可以显著提升数据处理速度,减少系统负担,并保持数据的稳定性和一致性。正确实施这些策略需要深入理解MySQL的工作原理和业务需求,以便做出最适合的配置调整。
338 6
|
2月前
|
SQL 存储 关系型数据库
深入 MySQL 的执行计划与性能优化
深入 MySQL 的执行计划与性能优化
39 0
|
3月前
|
存储 关系型数据库 MySQL
"深入探索MySQL临时表:性能优化利器,数据处理的灵活之选"
【8月更文挑战第9天】MySQL临时表专为存储临时数据设计,自动创建与删除,仅在当前会话中存在,有助于性能优化。它分为本地临时表和全局临时表(通过特定逻辑模拟)。创建语法类似于普通表,但加TEMPORARY或TEMP关键字。适用于性能优化、数据预处理和复杂查询,需注意内存占用和事务支持问题。合理使用可大幅提升查询效率。
207 2
|
4月前
|
SQL 存储 数据库
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用