- 8.2.1.1 WHERE子句优化
- 8.2.1.2 范围优化
- 8.2.1.3 索引合并优化
- 8.2.1.4 哈希连接优化
- 8.2.1.5 发动机工况下推优化
- 8.2.1.6 索引条件下推优化
- 8.2.1.7 嵌套循环连接算法
- 8.2.1.8 嵌套连接优化
- 8.2.1.9 外连接优化
- 8.2.1.10 外部连接简化
- 8.2.1.11 多范围读取优化
- 8.2.1.12 阻止嵌套循环和批量密钥访问连接
- 8.2.1.13 条件过滤
- 8.2.1.14 常量折叠优化
- 8.2.1.15 IS NULL 优化
- 8.2.1.16 ORDER BY 优化
- 8.2.1.17 GROUP BY优化
- 8.2.1.18 DISTINCT 优化
- 8.2.1.19 LIMIT 查询优化
- 8.2.1.20 函数调用优化
- 8.2.1.21 窗口函数优化
- 8.2.1.22 行构造函数表达式优化
- 8.2.1.23 避免全表扫描
查询以SELECT
语句的形式执行数据库中的所有查找操作。调整这些语句是重中之重,无论是实现动态网页的亚秒级响应时间,还是缩短时间以生成庞大的通宵报告。
除了SELECT
语句之外,查询的调优技术也适用于语句中的
CREATE
TABLE...AS SELECT
、
INSERT
INTO...SELECT
和WHERE
子句
等结构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 查询缓存,重复查询运行得更快,因为结果是第二次和后续时间从内存中检索的。即使对于使用缓存内存区域运行速度很快的查询,您仍然可以进一步优化,以便它们需要更少的缓存内存,从而使您的应用程序更具可扩展性。可扩展性意味着您的应用程序可以同时处理更多的用户、更大的请求等等,而不会出现性能的大幅下降。
处理锁定问题,您的查询速度可能会受到同时访问表的其他会话的影响。