MySQL 优化慢查询
查询以SELECT
语句的形式执行数据库中的所有查找操作。调整这些语句是重中之重,无论是实现动态网页的亚秒响应时间,还是缩短数小时生成大量夜间报告的时间。
此外SELECT
语句,进行查询调谐技术也适用于结构,如 CREATE TABLE...AS SELECT
, INSERT INTO...SELECT
和WHERE
在条款 DELETE
的语句。这些语句有额外的性能考虑,因为它们将写操作与面向读的查询操作结合起来。
NDB Cluster 支持 join pushdown 优化,其中合格的 join 被完整发送到 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 查询”。 -
您可以
InnoDB
使用第 8.5.3 节“优化 InnoDB 只读事务”中的技术优化表的 单查询事务 。 -
避免以难以理解的方式转换查询,尤其是在优化器自动执行某些相同转换的情况下。
-
如果某个基本准则无法轻松解决性能问题,请通过阅读
EXPLAIN
计划并调整索引、WHERE
子句、连接子句等来调查特定查询的内部细节 。(当您达到一定的专业水平时,阅读EXPLAIN
计划可能是您每次查询的第一步。) -
调整 MySQL 用于缓存的内存区域的大小和属性。通过有效使用
InnoDB
缓冲池、MyISAM
键缓存和 MySQL 查询缓存,重复查询运行得更快,因为结果是从内存中检索的第二次和后续时间。 -
即使对于使用高速缓存区域快速运行的查询,您仍然可以进一步优化,以便它们需要更少的高速缓存,从而使您的应用程序更具可扩展性。可扩展性意味着您的应用程序可以处理更多并发用户、更大的请求等,而不会导致性能大幅下降。
-
处理锁定问题,其中查询速度可能会受到同时访问表的其他会话的影响。