- 10.2.1.1 WHERE 子句优化
- 10.2.1.2 范围优化
- 10.2.1.3 索引合并优化
- 10.2.1.4 哈希连接优化
- 10.2.1.5 引擎条件下推优化
- 10.2.1.6 索引条件下推优化
- 10.2.1.7 嵌套循环连接算法
- 10.2.1.8 嵌套连接优化
- 10.2.1.9 外连接优化
- 10.2.1.10 外连接简化
- 10.2.1.11 多范围读取优化
- 10.2.1.12 块嵌套循环和批处理键访问连接
- 10.2.1.13 条件过滤
- 10.2.1.14 常量折叠优化
- 10.2.1.15 IS NULL 优化
- 10.2.1.16 ORDER BY 优化
- 10.2.1.17 GROUP BY 优化
- 10.2.1.18 DISTINCT 优化
- 10.2.1.19 LIMIT 查询优化
- 10.2.1.20 函数调用优化
- 10.2.1.21 窗口函数优化
- 10.2.1.22 行构造函数表达式优化
- 10.2.1.23 避免全表扫描
查询以 SELECT
语句的形式执行数据库中的所有查找操作。 调整这些语句是当务之急,无论是为了实现动态网页的亚秒级响应时间,还是为了将生成大型隔夜报表的时间缩短数小时。
除了 SELECT
语句之外,查询的调整技术也适用于 CREATE TABLE...AS SELECT
、INSERT INTO...SELECT
和 DELETE
语句中的 WHERE
子句等结构。 这些语句还有其他性能注意事项,因为它们将写操作与面向读取的查询操作结合在一起。
NDB Cluster 支持连接下推优化,借此将合格的连接完整地发送到 NDB Cluster 数据节点,在数据节点上可以将连接分布在各个节点之间并并行执行。 有关此优化的更多信息,请参阅NDB 下推连接的条件。
优化查询的主要注意事项是:
为了加快速度较慢的
SELECT ... WHERE
查询,首先要检查是否可以添加索引。 在WHERE
子句中使用的列上设置索引,以加快评估、过滤和最终检索结果的速度。 为了避免浪费磁盘空间,请构造一小组索引,以加快应用程序中使用的许多相关查询的速度。对于引用不同表(使用连接和外键等功能)的查询,索引尤其重要。 您可以使用
EXPLAIN
语句来确定SELECT
使用了哪些索引。 请参阅第 10.3.1 节“MySQL 如何使用索引”和第 10.8.1 节“使用 EXPLAIN 优化查询”。隔离并调整查询中任何耗时的部分,例如函数调用。 根据查询的结构,可以为结果集中的每一行调用一次函数,甚至可以为表中的每一行调用一次函数,这将大大增加任何低效性。
尽量减少查询中全表扫描的次数,尤其是对于大型表。
通过定期使用
ANALYZE TABLE
语句使表统计信息保持最新,以便优化器拥有构建高效执行计划所需的信息。了解针对每个表的存储引擎特有的调整技术、索引技术和配置参数。
InnoDB
和MyISAM
都有一套指南,用于在查询中启用和维持高性能。有关详细信息,请参阅 第 10.5.6 节“优化 InnoDB 查询” 和 第 10.6.1 节“优化 MyISAM 查询”。您可以使用 第 10.5.3 节“优化 InnoDB 只读事务” 中的技术优化
InnoDB
表的单查询事务。避免以难以理解的方式转换查询,尤其是在优化器自动执行某些相同转换的情况下。
如果性能问题无法通过其中一项基本准则轻松解决,请通过阅读
EXPLAIN
计划并调整索引、WHERE
子句、连接子句等来调查特定查询的内部细节。(当您达到一定专业水平时,阅读EXPLAIN
计划可能是您处理每个查询的第一步。)调整 MySQL 用于缓存的内存区域的大小和属性。通过有效使用
InnoDB
缓冲池、MyISAM
键缓存和 MySQL 查询缓存,重复查询的运行速度会更快,因为在第二次及后续查询时,结果将从内存中检索。即使是使用缓存内存区域快速运行的查询,您仍然可以进一步优化,使其需要的缓存内存更少,从而使您的应用程序更具可扩展性。可扩展性意味着您的应用程序可以处理更多并发用户、更大请求等,而不会导致性能大幅下降。
处理锁定问题,其中查询的速度可能会受到同时访问表的其他会话的影响。