文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  优化 SELECT 语句

10.2.1 优化 SELECT 语句

查询以 SELECT 语句的形式执行数据库中的所有查找操作。 调整这些语句是当务之急,无论是为了实现动态网页的亚秒级响应时间,还是为了将生成大型隔夜报表的时间缩短数小时。

除了 SELECT 语句之外,查询的调整技术也适用于 CREATE TABLE...AS SELECTINSERT INTO...SELECTDELETE 语句中的 WHERE 子句等结构。 这些语句还有其他性能注意事项,因为它们将写操作与面向读取的查询操作结合在一起。

NDB Cluster 支持连接下推优化,借此将合格的连接完整地发送到 NDB Cluster 数据节点,在数据节点上可以将连接分布在各个节点之间并并行执行。 有关此优化的更多信息,请参阅NDB 下推连接的条件

优化查询的主要注意事项是:

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

    对于引用不同表(使用连接外键等功能)的查询,索引尤其重要。 您可以使用 EXPLAIN 语句来确定 SELECT 使用了哪些索引。 请参阅第 10.3.1 节“MySQL 如何使用索引”第 10.8.1 节“使用 EXPLAIN 优化查询”

  • 隔离并调整查询中任何耗时的部分,例如函数调用。 根据查询的结构,可以为结果集中的每一行调用一次函数,甚至可以为表中的每一行调用一次函数,这将大大增加任何低效性。

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

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

  • 了解针对每个表的存储引擎特有的调整技术、索引技术和配置参数。InnoDBMyISAM 都有一套指南,用于在查询中启用和维持高性能。有关详细信息,请参阅 第 10.5.6 节“优化 InnoDB 查询”第 10.6.1 节“优化 MyISAM 查询”

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

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

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

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

  • 即使是使用缓存内存区域快速运行的查询,您仍然可以进一步优化,使其需要的缓存内存更少,从而使您的应用程序更具可扩展性。可扩展性意味着您的应用程序可以处理更多并发用户、更大请求等,而不会导致性能大幅下降。

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