Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Optimizing SELECT Statements

10.2.1 SELECT 语句优化

查询,以 SELECT 语句的形式,执行数据库中的所有查找操作。调整这些语句是优先考虑的,无论是为了实现动态网页的亚秒响应时间,还是为了将巨大overnight 报告的生成时间缩短数小时。

除了 SELECT 语句外,查询的调整技术也适用于构造如 CREATE TABLE...AS SELECTINSERT INTO...SELECTWHERE 子句在 DELETE 语句中的写操作结合读取操作。

NDB Cluster 支持连接下推优化,其中一个合格的连接将被发送到 NDB Cluster 数据节点,其中可以分布在它们之间并并行执行。有关此优化的更多信息,请参见 NDB 下推连接条件

优化查询的主要考虑是:

  • 要使慢速的 SELECT ... WHERE 查询更快,首先要检查的是是否可以添加一个 索引。在 WHERE 子句中使用的列上设置索引,以加速评估、过滤和结果的最终检索。为了避免磁盘空间的浪费,构建一个小的索引集合,以加速许多相关查询。

    索引对于查询非常重要,特别是那些使用连接和外键的查询。你可以使用 EXPLAIN 语句来确定哪些索引用于 SELECT。请参见 第 10.3.1 节,“MySQL 如何使用索引”第 10.8.1 节,“使用 EXPLAIN 优化查询”

  • 将查询中的任何部分,例如函数调用,隔离和调整,以便减少执行时间。根据查询的结构,函数可能会为每行结果集或每行表调用一次,从而大大放大任何效率低下的问题。

  • 尽量减少查询中的全表扫描次数,特别是对于大表。

  • 使用ANALYZE TABLE语句定期更新表统计信息,以便优化器可以获取所需的信息来构建高效的执行计划。

  • 学习每个表的存储引擎特定的调整技术、索引技术和配置参数。例如,InnoDBMyISAM都有其自己的高性能查询指南。详见第10.5.6节,“优化InnoDB查询”第10.6.1节,“优化MyISAM查询”

  • 您可以使用第10.5.3节,“优化InnoDB只读事务”中的技术来优化单个查询事务的InnoDB表。

  • 避免以难以理解的方式转换查询,特别是如果优化器自动执行类似的转换。

  • 如果性能问题不能通过基本指南轻松解决,请通过阅读EXPLAIN计划来调查查询的内部细节,并调整索引、WHERE子句、连接子句等。(当您达到一定的专家水平时,阅读EXPLAIN计划可能是您每个查询的第一步。)

  • 调整MySQL用于缓存的内存区域的大小和属性。通过高效地使用InnoDB缓冲池MyISAM键缓存和MySQL查询缓存,重复查询可以更快地从内存中检索结果。

  • 即使查询可以快速地使用缓存内存区域,您仍然可以进一步优化,以便减少缓存内存的使用,使您的应用程序更加可扩展。可扩展性意味着您的应用程序可以处理更多的同时用户、更大的请求等,而不会出现大的性能下降。

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