试试吧

全部免费,试试吧致力于打造领先的一站式在线工具平台!

加载中...

MySQL8 性能优化

MySQL8 性能优化,MySQL8教程,介绍 MySQL8 性能优化和示例等。

全栈教程https://try8.cn/article

教程目录:
教程内容:
最近更新:2023-04-17

一、MySQL8 性能优化介绍

MySQL8 性能优化可以选择提前或在问题发生后解决数据库配置和代码问题,您也可以通过优化 CPU 、内存和磁盘I/O 等提高可扩展性,目标是使数据库能够处理更多负载同时不降低速度,本章用于指引用户如何优化性能而非仅是语法教程。


1.1、数据层优化

MySQL8 性能优化最重要的是数据库基础设计,例如数据库表、查询、和配置的设置等。

  • 表结构是否正确,列是否设置了正确的数据类型;
  • 是否由合理的索引来提升查询效率;
  • 是否为每一个表选择合理的存储引擎,例如 InnoDB 和 MyISAM 区别很大;
  • 每个表是否有合理的行格式,压缩占用更少的磁盘空间和磁盘I/O;
  • 锁定策略是否合理,这对数据库并发影响很大;
  • 缓存是否合理,对于经常处理的数据,是否因为物理内存过大过小影响分页等。


1.2、硬件层优化

随着数据库越来越繁忙,任何软件都会达到最终的硬件限制,数据库管理人员必须通过评估调整应用程序或重新配置服务器以避免瓶颈,更多时候可能需要更高的硬件资源来突破瓶颈。

  • 磁盘寻道,磁盘找到一条数据需要时间,优化寻道时间可以将数据分布到多个磁盘上;
  • 磁盘读写,使用吞吐量较高的现代磁盘,一个磁盘至少提供20MB/S以上的吞吐量;
  • CPU周期,使用可以快速的执行和完成SQL指令的CPU;
  • 内存宽带,使用更大的内存宽带。


二、MySQL8 性能优化教程

MySQL8 数据库的核心逻辑是通过 SQL 语句执行的,您可以优化由解释器发出或 API 提交的 SQL 语句。

  • 添加索引仅在 where 子句的列上设置索引,为避免浪费磁盘空间,一组索引使用的列尽量少;
  • 隔离和调整查询中花费最多时间的代码,如函数调用,如可以通过专门调用一次函数来排查;
  • 尽量降低在数据库查询中使用全表扫描的次数,尤其是大表;
  • 通过定期使用 ANALYZE TABLE 语句进行表维护和保持最新的统计信息;
  • 通过阅读计划 EXPLAIN 的内部细节来调整无法轻易解决的性能问题;
  • 通过调整 MySQL 用于缓存的内存区域的大小和属性来优化查询;
  • 处理锁表,以解除可能会受到同时访问表的其它会话的影响。


2.1、索引使用优化

索引就像指向表行的指针,允许快速查询与确认结果,尽管为每一列创建索引很诱人,但是不必要的索引会浪费时间和空间。索引还会增加插入、更新和删除的成本,因为任意数据变更都必须重置索引,因此需要找到合理平衡点来使用最佳索引。


MySQL8 如何使用索引:

如果没有索引,MySQL8 必须从第一行开始,然后通读整个表以找到相关行,如果有相关列的索引,这可以快速确定要在数据文件中查找的位置,而无须查看所有数据,这比顺序读取每一行要快的多。

  • 快速匹配 where 条件;
  • 多个索引,通常使用找到最少行数的索引;
  • 多列索引采用左匹配模式,例如三列(col1, col2, col3),那么匹配 (col1)、(col1, col2)和(col1, col2, col3);
  • 表连接时,相同类型和大小的列可以更有效的使用索引;
  • 对于报表处理大部分或全部行的表,索引意义不大,此时顺序读取比通过索引更快。


2.2、库表结构优化

优化数据库结构,包含优化数据大小、数据类型,针对多个表进行优化,以及对库表、行列等数量进行限制等。

  • 尽可能使用最小的数据类型,以便节省磁盘空间和内存;
  • 如果可以,尽量将列声明为:not null;
  • 主索引尽量短一些,这会使得每一行的识别更加容易和高效;
  • 列名要短小,如用户表 user,列名使用 name 而非 user_name;
  • 尽量保持数据不冗余,符合第三范式要求,您可以分配唯一ID来代替重复名称。


2.3、存储引擎优化

主要介绍默认存储引擎 InnoDB 和常用存储引擎 MyISAM 的优化指引。


InnoDB 是 MySQL 在可靠性和并发性要求很高的生产数据库中推荐的存储引擎,它是 MySQL 的默认存储引擎。

  • 对于大小稳定的表,请使用 OPTIMIZE TABLE 重组,重组后使用更少的磁盘 I/O 来执行全表扫描;
  • 主键名称一定要短小,否则会浪费大量磁盘空间,特长的主键可以选择自增列代替;
  • 使用 varchar 而非 char 类型来存储可变长度的字符串;
  • 对于很大或包含大量重复文本的表,请使用 COMPRESSED 行格式,以减少磁盘 I/O。


MyISAM 是在读取为主的数据或低并发操作时表现最佳,因为表锁限制了执行同步更新的并发能力。

  • 尽量避免 SELECT 对频繁更新的表进行复杂的查询,用于避免表锁定的问题;
  • 对于经常更改的表,尽量避免使用所有可变长度列,例如:VARCHAR、 BLOB和 TEXT等;
  • 如果您通常按顺序检索行, 请使用:alter table ... order by expr1, expr2;
  • 定期使用语句 OPTIMIZE TABLE 以避免动态格式 MyISAM 表产生碎片;
  • 您可以通过在应用程序中缓存查询,然后批量执行插入或更新来提高性能。


三、MySQL8 查询执行计划

MySQL 优化器使用了很多技术来有效地执行 SQL 查询,优化器选择执行最高效查询的一组操作称为:查询执行计划,也称为 EXPLAIN 计划,如果您发现一些低效操作,请学习 MySQL 语法和索引技术以改进执行计划。


3.1、EXPLAIN 优化

EXPLAIN 用于执行查询和解释语句,适用于 SELECT、DELETE、INSERT、REPLACE、UPDATE 和 TABLE 等。


输出库表结构示例:

explain try8_dev;


输出执行计划示例:

# 默认输出格式
explain select * from try8_dev;
# 指定格式输出
explain format=traditional select * from try8_dev;
explain format=tree select * from try8_dev;
explain format=json select * from try8_dev;


输出执行计划扩展示例:

explain analyze select * from try8_dev;


四、MySQL8 性能优化 总结

MySQL8教程 - MySQL8 性能优化,介绍 MySQL 和 MySQL8 数据库,从 MySQL8 性能优化介绍开始,逐步到 MySQL8 索引和执行计划等,通篇实用易懂,让 MySQL8 入门更加快速和简单。


《MySQL8教程》主打原创、全部免费,欢迎学习和转载,如需交流请加微信号:try8_cn。