Documentation Home
MySQL 8.0 参考手册  / 第8章优化  / 8.2 优化SQL语句  /  8.2.1 优化 SELECT 语句

8.2.1 优化 SELECT 语句

查询以SELECT 语句的形式执行数据库中的所有查找操作。调整这些语句是重中之重,无论是实现动态网页的亚秒级响应时间,还是缩短时间以生成庞大的通宵报告。

除了SELECT语句之外,查询的调优技术也适用于语句中的 CREATE TABLE...AS SELECTINSERT INTO...SELECTWHERE子句 等结构DELETE。这些语句具有额外的性能考虑因素,因为它们将写入操作与面向读取的查询操作结合在一起。

NDB Cluster 支持连接下推优化,通过该优化,合格的连接将被完整发送到 NDB Cluster 数据节点,在那里它可以分布在它们之间并并行执行。有关此优化的更多信息,请参阅 NDB 下推连接的条件

优化查询的主要考虑因素是:

  • 要使慢SELECT ... WHERE查询更快,首先要检查是否可以添加 索引。在子句中使用的列上设置索引WHERE,以加速评估、过滤和最终检索结果。为避免浪费磁盘空间,请构建一小组索引来加速应用程序中使用的许多相关查询。

    索引对于使用连接外键 等功能引用不同表的查询尤其重要 。您可以使用该EXPLAIN语句来确定哪些索引用于 SELECT. 参见 第 8.3.1 节,“MySQL 如何使用索引”第 8.8.1 节,“使用 EXPLAIN 优化查询”

  • 隔离和调整查询中花费过多时间的任何部分,例如函数调用。根据查询的结构,可以为结果集中的每一行调用一次函数,甚至可以为表中的每一行调用一次函数,从而大大放大任何低效率。

  • 尽量减少查询中的 全表扫描次数 ,尤其是对于大表。

  • 通过定期使用语句使表统计信息保持最新 ANALYZE TABLE,因此优化器具有构建有效执行计划所需的信息。

  • 学习特定于每个表的存储引擎的调优技术、索引技术和配置参数。两者InnoDB都有 MyISAM一套指导方针来启用和维持查询的高性能。有关详细信息,请参阅第 8.5.6 节,“优化 InnoDB 查询”第 8.6.1 节,“优化 MyISAM 查询”

  • 您可以使用第 8.5.3 节,“优化 InnoDB 只读事务”InnoDB中的技术 优化表的单查询事务 。

  • 避免以难以理解的方式转换查询,尤其是在优化器自动执行某些相同转换的情况下。

  • 如果某个基本准则无法轻易解决性能问题,请通过阅读 EXPLAIN计划和调整索引、WHERE子句、连接子句等来调查特定查询的内部细节。(当您达到一定的专业水平时,阅读 EXPLAIN计划可能是您每次查询的第一步。)

  • 调整 MySQL 用于缓存的内存区域的大小和属性。通过有效使用 InnoDB 缓冲池MyISAM键缓存和 MySQL 查询缓存,重复查询运行得更快,因为结果是第二次和后续时间从内存中检索的。

  • 即使对于使用缓存内存区域运行速度很快的查询,您仍然可以进一步优化,以便它们需要更少的缓存内存,从而使您的应用程序更具可扩展性。可扩展性意味着您的应用程序可以同时处理更多的用户、更大的请求等等,而不会出现性能的大幅下降。

  • 处理锁定问题,您的查询速度可能会受到同时访问表的其他会话的影响。