Mysql优化

发布于:2024-04-19 ⋅ 阅读:(34) ⋅ 点赞:(0)

概述

MYSQL优化主要分为以下四大方面:
硬件及操作系统层面优化:
设计:存储引擎,字段类型,范式与逆范式
功能:索引,缓存,分区分表。
架构:主从复制,读写分离,负载均衡。
合理SQL

mysql优化方法

存储引擎的选择、字段类型的选择、索引的选择、分区分表、主从复制、读写分离、SQL 优化

  1. 合适的硬件配置: 确保MySQL服务器的硬件配置足够强大,包括CPU、内存、磁盘等。特别是对于IO密集型的应用,磁盘性能至关重要。
  2. 优化数据库配置:
    ○ 调整缓冲区大小,如innodb_buffer_pool_size、key_buffer_size等,以适应数据库的工作负载。
    ○ 调整连接数和线程池配置,避免过多的连接导致资源竞争和性能下降。
    ○ 合理配置日志和复制参数,以保证数据的一致性和安全性。
  3. 合适的存储引擎选择: MySQL提供了多种存储引擎,如InnoDB、MyISAM等,每种引擎都有其适用的场景。一般而言,推荐使用InnoDB引擎,特别是对于事务性应用。
  4. 索引优化:
    ○ 确保表上存在合适的索引,以加速查询。
    ○ 避免过多的索引,因为每个索引都会占用额外的存储空间和写操作成本。
    ○ 定期对索引进行维护和优化,删除不再需要的索引,重建索引以提高性能。
  5. SQL查询优化:
    ○ 确保SQL查询语句简洁高效,避免不必要的列和行。
    ○ 使用合适的JOIN操作,避免全表扫描和大表连接。
    ○ 避免使用负向条件和函数操作,以充分利用索引。
    ○ 使用EXPLAIN来分析查询计划,了解查询性能瓶颈,并进行相应的调整和优化。
  6. 分区和分表: 对于大表,可以考虑使用分区或者分表来减轻数据库的压力,提高查询性能。
  7. 定期备份和优化: 定期对数据库进行备份,并进行数据库的优化和维护,如碎片整理、统计信息更新等。
  8. 缓存优化: 使用合适的缓存机制,如查询缓存、应用层缓存、反向代理缓存等,减少数据库的访问次数,提高性能。
  9. 监控和调优: 定期监控数据库的性能指标,如CPU、内存、磁盘IO等,及时发现性能瓶颈并进行调优。
    综上所述,MySQL优化涉及多个方面,需要综合考虑硬件、数据库配置、SQL查询优化等多个因素,以提高数据库的性能和可靠性。

硬件及操作系统层面优化

从硬件层面来说,影响 Mysql 性能的因素有,CPU、可用内存大小、磁盘读写速度、网络带宽从操作系层面来说,应用文件句柄数、操作系统网络的配置都会影响到 Mysql性能。这部分的优化一般由 DBA 或者运维工程师去完成。在硬件基础资源的优化中,我们重点应该关注服务本身承载的体量,然后提出合理的指标要求,避免出现资源浪费
选择正确的存储引擎
在 MySQL 中有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。
MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。
InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。
架构设计层面的优化–表设计-分库分表–读写分离主从
MySQL 是一个磁盘 IO 访问量非常频繁的关系型数据库,在高并发和高性能的场景中.MySQL 数据库必然会承受巨大的并发压力,而此时,我们的优化方式可以分为几个部分。

  1. 搭建 Mysql 主从集群,单个 Mysql 服务容易单点故障,一旦服务器宕机,将会导致依赖 Mysql 数据库的应用全部无法响应。 主从集群或者主主集群可以保证服务的高可用性。
  2. 读写分离设计,在读多写少的场景中,通过读写分离的方案,可以避免读写冲突导致的性能影响
  3. 引入分库分表机制,通过分库可以降低单个服务器节点的 IO 压力,通过分表的方式可以降低单表数据量,从而提升 sql 查询的效率。
  4. 针对热点数据,可以引入更为高效的分布式数据库,比如 Redis、MongoDB等,他们可以很好的缓解 Mysql 的访问压力,同时还能提升数据检索性能。
    MySQL 程序配置优化-数据库参数设置
    MySQL 是一个经过互联网大厂验证过的生产级别的成熟数据库,对于 Mysql 数据库本身的优化,一般是通过 Mysql 中的配置文件 my.cnf 来完成的,比如。Mysql5.7 版本默认的最大连接数是 151 个,这个值可以在 my.cnf 中修改。binlog 日志,默认是不开启,缓存池 bufferpoll 的默认大小配置等。由于这些配置一般都和用户安装的硬件环境以及使用场景有关系,因此这些配置,官方只会提供一个默认值,具体情况还得由使用者来修改。关于配置项的修改,需要关注两个方面。配置的作用域,分为会话级别和全局,是否支持热加载,因此,针对这两个点,我们需要注意的是:全局参数的设定对于已经存在的会话无法生效,会话参数的设定随着会话的销毁而失效,全局类的统一配置建议配置在默认配置文件中,否则重启服务会导致配置失效

SQL 优化

1.、慢 SQL 的定位和排查,我们可以通过慢查询日志和慢查询日志分析工具得到有问题的 SQL 列表。
2、执行计划分析针对慢 SQL,我们可以使用关键字 explain 来查看当前 sql 的执行计划.可以重点,关注 type key rows filterd 等字段 ,从而定位该 SQL 执行慢的根本原因。再有的放矢的进行优化
3.使用 show profile 工具
Show Profile 是 MySQL 提供的可以用来分析当前会话中,SQL 语句资源消耗情况的工具,可用于 SQL 调优的测量。在当前会话中.默认情况下处于 show profile是关闭状态,打开之后保存最近 15 次的运行结果针对运行慢的 SQL,通过 profile 工具进行详细分析.可以得到 SQL 执行过程中所有的资源开销情况.如 IO 开销,CPU 开销,内存开销等.以上就是我对 MySQL 性能优化的理解。

数据库的设计优化

数据库设计方面
● 建立索引
● 分区
● 尽量使用固定长度的字段
● 限制字段长度
在数据库I/O方面
● 增加缓冲区
● 如果涉及表的级联,不同的表存储在不同的磁盘上,以增加I/O速度
在SQL语句方面
● 优化SQL语句,减少比较次数
● 使用limit
JAVA方面 如果反复使用的查询,使用PreparedStatement减少查询次数

创建索引,但不是越多越好,经常用到的数据建索引,
索引多的话,不仅会占用内存空间,而且会降低查询效率,索引不是越多越好,
表之间关联度下降,多使用单表查询
减少访问数据库的次数:
用TRUNCATE替代DELETE:
1、表的设计要符合三大范式。
2、添加适当的索引索引对查询速度影响很大,必须添加索引。主键索引,唯一索引,普通索引,全文索引
3、添加适当存储过程,触发器,事务等。
4、读写分离(主从数据库)
5、对sql语句的一些优化,(查询执行速度比较慢的sql语句)
6、分表分区:分表:把一张大表分成多张表。分区:把一张表里面的分配到不同的区域存储
7、对mysql服务器硬件的升级操作