- 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
语句的形式,执行数据库中的所有查找操作。调整这些语句是优先考虑的,无论是为了实现动态网页的亚秒响应时间,还是为了将巨大overnight 报告的生成时间缩短数小时。
除了 SELECT
语句外,查询的调整技术也适用于构造如 CREATE TABLE...AS SELECT
、INSERT INTO...SELECT
和 WHERE
子句在 DELETE
语句中的写操作结合读取操作。
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查询缓存,重复查询可以更快地从内存中检索结果。 -
即使查询可以快速地使用缓存内存区域,您仍然可以进一步优化,以便减少缓存内存的使用,使您的应用程序更加可扩展。可扩展性意味着您的应用程序可以处理更多的同时用户、更大的请求等,而不会出现大的性能下降。
-
处理锁定问题,其中查询的速度可能会受到其他会话同时访问表的影响。