MySQL优化(3):SELECT 语句优化概述

数据库应用程序的核心逻辑是通过 SQL 语句执行的,无论是通过解释器直接发出的,还是通过API在后台提交的。

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

本系列文章的调优指南有助于提高各种 MySQL 应用程序的速度。这些指南包括读写数据的 SQL 操作、一般SQL操作的后台开销,以及在特定场景(如数据库监视)中使用的操作。

除了 SELECT 语句外,查询的调优技术还适用于诸如 CREATETABLE…as SELECTINSERT INTO…SELECTDELETE语句中的 WHERE子 句等构造。这些语句有额外的性能考虑,因为它们将写操作与面向读的查询操作结合起来。

NDB Cluster 支持 join 下推优化,将符合条件的 join 整体发送到 NDB Cluster 数据节点,在这些节点之间可以分布并并行执行。有关此优化的详细信息,参考 Conditions for NDB pushdown joins

SELECT优化考虑因素

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

  • 要使慢速 SELECT ... WHERE 查询更快,首先要检查是否可以添加索引。

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

    索引对于使用连接和外键等功能引用不同表的查询尤其重要。 可以使用 EXPLAIN 语句来确定哪些索引用于 SELECT。

  • 隔离 和 调整查询 的任何部分,例如函数调用,这需要过多的时间。

    根据查询的结构方式,可以为结果集中的每一行调用一次函数,甚至可以为表中的每一行调用一次函数,这大大放大了任何低效率。

  • 最小化查询中的全表扫描数,特别是对于大表。

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

  • 了解特定于每个表的存储引擎的调优技术、索引技术和配置参数。

    InnoDB 和 MyISAM 都有一套指导方针来启用和维持查询的高性能。

  • 可以使用 优化 InnoDB 只读事务中的技术优化 InnoDB 表的单查询事务。

  • 避免以难以理解的方式转换查询,特别是当优化器自动执行某些相同的转换时。

  • 如果性能问题不能通过基本准则之一轻松解决,请通过阅读 EXPLAIN 计划并调整索引、WHERE 子句、连接子句等来调查特定查询的内部细节。

    (当达到一定的专业水平时,阅读 EXPLAIN 计划可能是您每次查询的第一步)

  • 调整 MySQL 用于缓存的内存区域的大小和属性。

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

  • 即使对于使用高速缓存区域快速运行的查询,仍然可以进一步优化,以便它们需要更少的高速缓存,从而使您的应用程序更具可扩展性。

    可扩展性意味着您的应用程序可以处理更多并发用户、更大的请求等,而不会导致性能大幅下降。

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

SELECT优化细分

  • WHERE 子句优化
  • 范围优化
  • 索引合并优化
  • Hash Join 优化
  • 引擎条件下推优化
  • 索引条件下推优化
  • 嵌套循环连接算法
  • 嵌套连接优化
  • 外连接优化
  • 外连接简化
  • 多范围读取优化
  • 阻止嵌套循环和批量密钥访问联接
  • 条件过滤
  • 恒定折叠优化
  • IS NULL 优化
  • ORDER BY 优化
  • GROUP BY 优化
  • DISTINCT 优化
  • LIMIT 查询优化
  • 函数调用优化
  • 行构造函数表达式优化
  • 避免全表扫描
作者

光星

发布于

2021-07-06

更新于

2023-03-06

许可协议

评论