MySQL 优化慢查询

查询以SELECT 语句的形式执行数据库中的所有查找操作。调整这些语句是重中之重,无论是实现动态网页的亚秒响应时间,还是缩短数小时生成大量夜间报告的时间。

此外SELECT语句,进行查询调谐技术也适用于结构,如 CREATE TABLE...AS SELECT, INSERT INTO...SELECTWHERE在条款 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 查询缓存,重复查询运行得更快,因为结果是从内存中检索的第二次和后续时间。

  • 即使对于使用高速缓存区域快速运行的查询,您仍然可以进一步优化,以便它们需要更少的高速缓存,从而使您的应用程序更具可扩展性。可扩展性意味着您的应用程序可以处理更多并发用户、更大的请求等,而不会导致性能大幅下降。

  • 处理锁定问题,其中查询速度可能会受到同时访问表的其他会话的影响。

posted on 2021-07-27 13:27  王半仙儿的博客  阅读(81)  评论(0编辑  收藏  举报

导航