- 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 集群支持连接下推优化,通过该优化,符合条件的连接会完整地发送到 NDB 集群数据节点,在这些节点上,连接可以分发并在它们之间并行执行。有关此优化的更多信息,请参阅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 查询缓存,重复查询的运行速度更快,因为结果在第二次和后续时间从内存中检索。即使是使用缓存内存区域快速运行的查询,您仍然可以进一步优化,以便它们需要更少的缓存内存,从而使您的应用程序更具可扩展性。可扩展性意味着您的应用程序可以处理更多并发用户、更大请求等,而不会遇到性能大幅下降。
处理锁定问题,其中查询的速度可能会受到同时访问表的其他会话的影响。