MySQL优化方案

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL优化方案

MySQL优化方案

一、MySQL优化理论

1.优化原则

  • 减少磁盘的IO次数,尽量按照索引查找,避免全表扫描。
  • 只查询用到的数据,没用到的数据不要查询,减少查询结果数据大小。

2.优化方案

(1)索引优化

  • 在区分度高的字段上建立索引。
  • 建立组合索引的时候考虑是否会形成索引覆盖,这样会减少回表的次数。
  • 建立组合索引时,遵循最左匹配原则。将查询频率比较高,区分度比较大的字段放在最左侧。
  • 为作为查询条件和进行排序操作的字段建立索引,比如where、group by、order by字段建立索引。
  • 索引字段作为条件查询时,不要进行函数计算,不要使用!=或<>操作符,这样不会命中索引,会退化到全表扫描。

(2)SQL优化

查询优化

  • 尽量避免使用select * 这样的SQL语句,这样让优化器无法完成索引覆盖,降低了优化器的执行效率,同时返回了更多的数据,占用了更多的网络带宽。

关联优化

  • 多表union关联的时候小表在前,大表在后,这是由于MySQL在进行多表union操作的时候,会先全表扫描前一张表,再关联后一张表。
  • 多数场景建议使用join/union,不建议使用子查询,由于子查询会生成中间临时表,对于性能的消耗比较大。

分页优化

  • 使用合理的分页来提高效率,在SQL中利用offset和limit来限制查询的起始位置和条数,能够在SQL做就不要在代码中做。

复杂语句

  • 复杂语句可以拆分成多个简单语句来执行,这是由于复杂语句由于可能长时间加锁导致执行时间更长;

(3)库表优化

  • 数据量比较大的情况可以进行分库分表操作,一般可以按照水平分库或者垂直分库的方式。
  • 也可以通过引入集群模式,实现读写分离,这样读写的操作压力不会集中在一个节点上。

(4)配置优化

  • 合理使用存储引擎,比如根据不同的业务场景选择使用InnoDB还是MySIAM的存储引擎。
  • 预期开启数据库缓存,要开启多大的等,这些可以通过修改数据库配置项实现。常见的配置项修改包括最大连接数max_connections,buffer pool的大小innodb_buffer_pool_size 等。

(5)其他方面

  • 通过程序操作数据库,如果短时间内频繁操作的话,可以进行批量操作。

总结:最主要的优化策略还是索引优化和SQL优化,之后就是再调整下Mysql的配置参数,想读写分离、分库分表在系统架构设计的时候就需要确定,后续变更的成本太高。

二、MySQL优化实践

几个问题主要代表了MySQL实践过程中年可能会碰到的问题。

1.通过explain查看查询计划

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。通过一下语句可以查看查询计划:

EXPLAIN SELECT [查找字段名] FROM tab_name ...

查询计划结构中每个字段的含义:

image-20221213225928842

1. id列

id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。

2. select_type列

select_type 表示对应行是简单还是复杂的查询。

3. table列

这一列表示 explain 的一行正在访问哪个表。

4. partitions列

如果查询是基于分区表的话,partitions 字段会显示查询将访问的分区。

5. type列

这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。

依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL;一般来说,得保证查询达到range级别,最好达到ref。

6. possible_keys列

这一列显示查询可能使用哪些索引来查找。

7. key列

这一列显示mysql实际采用哪个索引来优化对该表的访问。

8. key_len列

这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。

9. ref列

这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名(例:film.id)

10. rows列

这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数。

11. filtered 列

该列是一个百分比的值,rows filtered/100 可以*估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的id值比当前表id值小的表)。

12. Extra列

这一列展示的是额外信息

2.进行分库分表

MySQL数据库数据超过2000w,基本就达到了性能瓶颈,可以考虑通过分库分表来分担单点压力。但是分布分表会带来一些问题,比如对于一些排序、连接等功能会失效,或者对于单条insert、update语句会失效。以下就几个问题进行探讨。

(1)如何进行拆分

对于分布分表,通用方式有水平拆分和垂直拆分。水平拆分是将一张表的数据水平切分为多张表来保存,可以用到的方式是按照ID范围或者进行hash运算后拆分;垂直拆分是将一张表的字段拆分成多组,每一组放到一张表中,这种一般情况下可以根据业务来进行拆封。

(2)数据如何进行排序?

对于拆分后的数据怎么进行排序?有个思路是根据查询语句select * from t1 order by id向数据库分片查询数据,查询的数据汇集到内存,如果有N个分片,则会存在N个数据块,再通过归并排序的方式对其进行排序。

(3)如何生成分布式ID?

业界有比较多的生成分布式ID的算法,核心思路是分布式ID的不同分段代表的含义不一样,比如前部分代码时间,中间部分代表数据库实例,最后部分代表的是表的自增序列。

3.开启慢查询优化

可是事后开启慢查询监控,当数据库SQL执行超过一定时长,再做优化。

使用druid数据库连接池就能查看到慢查询日志。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9天前
|
关系型数据库 MySQL Linux
MySQL原理简介—6.简单的生产优化案例
本文介绍了数据库和存储系统的几个主题: 1. **MySQL日志的顺序写和数据文件的随机读指标**:解释了磁盘随机读和顺序写的原理及对数据库性能的影响。 2. **Linux存储系统软件层原理及IO调度优化原理**:解析了Linux存储系统的分层架构,包括VFS、Page Cache、IO调度等,并推荐使用deadline算法优化IO调度。 3. **数据库服务器使用的RAID存储架构**:介绍了RAID技术的基本概念及其如何通过多磁盘阵列提高存储容量和数据冗余性。 4. **数据库Too many connections故障定位**:分析了MySQL连接数限制问题的原因及解决方法。
|
12天前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
4天前
|
缓存 算法 关系型数据库
MySQL底层概述—8.JOIN排序索引优化
本文主要介绍了MySQL中几种关键的优化技术和概念,包括Join算法原理、IN和EXISTS函数的使用场景、索引排序与额外排序(Using filesort)的区别及优化方法、以及单表和多表查询的索引优化策略。
MySQL底层概述—8.JOIN排序索引优化
|
5天前
|
SQL 关系型数据库 MySQL
MySQL底层概述—7.优化原则及慢查询
本文主要介绍了:Explain概述、Explain详解、索引优化数据准备、索引优化原则详解、慢查询设置与测试、慢查询SQL优化思路
MySQL底层概述—7.优化原则及慢查询
|
5天前
|
存储 缓存 关系型数据库
MySQL底层概述—5.InnoDB参数优化
本文介绍了MySQL数据库中与内存、日志和IO线程相关的参数优化,旨在提升数据库性能。主要内容包括: 1. 内存相关参数优化:缓冲池内存大小配置、配置多个Buffer Pool实例、Chunk大小配置、InnoDB缓存性能评估、Page管理相关参数、Change Buffer相关参数优化。 2. 日志相关参数优化:日志缓冲区配置、日志文件参数优化。 3. IO线程相关参数优化: 查询缓存参数、脏页刷盘参数、LRU链表参数、脏页刷盘相关参数。
MySQL底层概述—5.InnoDB参数优化
|
7天前
|
关系型数据库 MySQL 数据库
从MySQL优化到脑力健康:技术人与效率的双重提升
聊到效率这个事,大家应该都挺有感触的吧。 不管是技术优化还是个人状态调整,怎么能更快、更省力地完成事情,都是我们每天要琢磨的事。
56 23
|
7天前
|
SQL 关系型数据库 MySQL
MySQL原理简介—11.优化案例介绍
本文介绍了四个SQL性能优化案例,涵盖不同场景下的问题分析与解决方案: 1. 禁止或改写SQL避免自动半连接优化。 2. 指定索引避免按聚簇索引全表扫描大表。 3. 按聚簇索引扫描小表减少回表次数。 4. 避免产生长事务长时间执行。
|
24天前
|
监控 关系型数据库 MySQL
Aurora MySQL负载突增应对策略与优化方案
通过以上策略,企业可以有效应对 Aurora MySQL 的负载突增,确保数据库在高负载情况下依然保持高性能和稳定性。这些优化方案涵盖了从架构设计到具体配置和监控的各个方面,能够全面提升数据库的响应速度和处理能力。在实际应用中,应根据具体的业务需求和负载特征,灵活调整和应用这些优化策略。
51 22
|
24天前
|
Java 关系型数据库 MySQL
MySQL 分库分表方案
本文总结了数据库分库分表的相关概念和实践,针对单张表数据量过大及增长迅速的问题,介绍了垂直和水平切分的方式及其适用场景。文章分析了分库分表后可能面临的事务支持、多库结果集合并、跨库join等问题,并列举了几种常见的开源分库分表中间件。最后强调了不建议水平分库分表的原因,帮助读者在规划时规避潜在问题。
125 20
|
29天前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
239 0

推荐镜像

更多