大家好,我是Bingo,一枚IT从业者,通过翻译MySQL8.0文档来学习MySQL。今天是我的第二篇文稿,请大家验收
8.2 SQL语句优化
数据库应用程序的核心逻辑是通过 SQL 语句执行的,无论是通过解释器直接发出还是通过 API 在后台提交。本节中的调优指南有助于加速各种 MySQL 应用程序。该指南涵盖了读取和写入数据的 SQL 操作、一般 SQL 操作的幕后开销以及在特定场景(如数据库监控)中使用的操作。
8.2.1 优化SELECT语句
以 SELECT 查询语句的形式执行数据库中的所有查找操作。调整这些语句是重中之重,无论是实现动态网页的亚秒级响应时间,还是缩短生成大量隔夜报告的时间。
除了 SELECT 语句,查询的调优技术也适用于 CREATE TABLE...AS SELECT、INSERT INTO...SELECT 和 DELETE 语句中的 WHERE 子句等结构。这些语句有额外的性能考虑,因为它们结合了写操作和面向读的查询操作。
NDB Cluster 支持连接下推优化,其中合格的连接被完整地发送到 NDB Cluster 数据节点,在那里它可以分布在它们之间并并行执行。有关此优化的更多信息,请参阅 NDB 下推连接的条件。
优化查询的主要考虑因素是:
1、要使慢SQL查询更快,首先要检查的是是否可以添加索引。在 WHERE 子句中使用的列上设置索引,以加快评估、过滤和最终检索结果的速度。为避免浪费磁盘空间,构建联合索引来加速应用程序中使用的许多相关查询。
对于使用连接和外键等功能引用不同表的查询,索引尤其重要。您可以使用 EXPLAIN 语句来确定哪些索引用于 SELECT。请参阅第 8.3.1 节,“MySQL 如何使用索引”和第 8.8.1 节,“使用 EXPLAIN 优化查询”。
2、查询和过滤的任何部分,如果有函数调用,会花费过多时间。根据查询的结构,为结果集中的每一行调用一次函数,甚至为表中的每一行调用一次函数,这极大地放大了任何低效率。
3、尽量减少查询中的全表扫描次数,尤其是对于大表。
4、通过定期使用 ANALYZE TABLE 语句使表统计信息保持最新,为优化器及时提供构建有效执行计划所需的信息。
5、了解各个表的存储引擎的调优技术、索引技术和配置参数。 InnoDB 和 MyISAM 都有一套指导方针来启用和维持查询的高性能。有关详细信息,请参阅第 8.5.6 节,“优化 InnoDB 查询”和第 8.6.1 节,“优化 MyISAM 查询”。
6、您可以使用第 8.5.3 节“优化 InnoDB 只读事务”中的技术优化 InnoDB 的单表查询事务。
7、避免以难以理解的方式转换查询,尤其是在优化器自动执行某些相同的转换时。
8、如果性能问题不能通过基本准则之一轻松解决,请通过阅读 EXPLAIN 计划并调整索引、WHERE 子句、连接子句等来调查特定查询的内部细节。 (当您达到一定的专业水平时,阅读 EXPLAIN 计划可能是您每次查询的第一步。)
9、调整 MySQL 用于缓存的内存区域的大小和属性。通过有效使用 InnoDB 缓冲池、MyISAM 键缓存和 MySQL 查询缓存,重复查询运行得更快,因为结果是从内存中直接检索的。
10、即使对于使用缓存内存区域快速运行的查询,您仍然可以进一步优化,以便它们需要更少的缓存内存,从而使您的应用程序更具可扩展性。可扩展性意味着您的应用程序可以处理更多的并发用户、更大的请求等,而不会出现性能大幅下降。
11、处理锁问题,您的查询速度可能会受到同时访问表的其他会话的影响。