10.2.1 选择语句优化
- 10.2.1.1 WHERE 子句优化
- 10.2.1.2 Range 优化
- 10.2.1.3 Index Merge 优化
- 10.2.1.4 Hash 连接优化
- 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
和WHERE
子句在DELETE
语句中。这些语句在组合写操作与读取操作时有额外的性能考虑。
NDB集群支持join推送优化,可以将符合条件的join发送到NDB集群数据节点上,并在其中分布和并行执行。关于这项优化的更多信息,请参见NDB推送join条件。
优化查询的主要考虑因素是:
-
要使一个慢速的
SELECT ... WHERE
查询速度更快,首先需要检查是否可以添加索引。为WHERE
子句中的列设置索引,以加速评估、过滤和最终结果的检索。为了避免浪费磁盘空间,构建一个小的索引集,以加速许多相关查询在应用程序中使用。索引对查询特别重要,尤其是在引用不同表的查询中,使用特性如join和foreign key。可以使用
EXPLAIN
语句来确定哪些索引用于一个SELECT
语句。请参见Section 10.3.1,“MySQL如何使用索引”和Section 10.8.1,“使用EXPLAIN优化查询”。 -
孤立并优化查询中的任何部分,例如函数调用,那么该函数可能会在结果集中的每一行或每一行表中被调用,从而大大增加任何不效率。
-
尽量减少查询中的全表扫描,特别是对于大表。
-
定期使用
ANALYZE TABLE
语句来保持表统计信息的最新,以便优化器可以构建一个高效的执行计划。 -
学习存储引擎特定的优化技术、索引技术和配置参数。Both
InnoDB
和MyISAM
都有优化查询的指南。详细信息,请见第10.5.6节,“优化 InnoDB 查询”和第10.6.1节,“优化 MyISAM 查询”。 -
您可以使用第10.5.3节,“优化 InnoDB 读写事务”中的技术来优化单个查询事务的
InnoDB
表。 -
避免将查询转换为难以理解的形式,特别是优化器可能自动执行的相同转换。
-
如果性能问题无法通过基本指南解决,调查查询的内部细节,阅读
EXPLAIN
计划,并调整索引、WHERE
子句、连接子句等。 -
调整 MySQL 使用的内存缓存大小和属性。使用高效的
InnoDB
缓冲池、MyISAM
键缓存和 MySQL 查询缓存,可以提高重复查询的速度,因为结果可以从内存中快速获取。 -
即使使用缓存内存区域的查询速度很快,您可能还需要进一步优化,以便它们需要更少的缓存内存,使您的应用程序更加可扩展。可扩展性意味着您的应用程序可以处理更多的同时用户、更大的请求等,而不需要性能下降。
-
解决锁定问题,查询速度可能受到其他会话访问同一表的影响。