• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 位置: MySQL 8 中文手册 -> MySQL 性能优化

    优化SELECT语句

    本章说明如何优化MySQL性能并提供示例。优化涉及多个级别的配置,调整和测量性能。根据您的工作角色(开发人员,DBA或两者的组合),您可以在单个SQL语句,整个应用程序,单个数据库服务器或多个联网数据库服务器的级别进行优化。有时您可能会很主动,并提前计划性能,而其他时候,您可能会在问题发生后对配置或代码问题进行故障排除。优化CPU和内存使用率也可以提高可伸缩性,从而使数据库能够处理更多负载而不会降低速度。

    数据库应用程序的核心逻辑是通过SQL语句执行的,无论是通过解释器直接发出还是通过API在后台提交。本节中的调优指南有助于加快各种MySQL应用程序的速度。该准则涵盖了读写数据的SQL操作,一般SQL操作的幕后开销以及在特定方案(例如数据库监视)中使用的操作。

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

    此外SELECT语句,进行查询调谐技术也适用于结构,如CREATE TABLE...AS SELECTINSERT INTO...SELECTWHERE在条款DELETE的语句。这些语句还有其他性能方面的考虑,因为它们将写操作与面向读取的查询操作结合在一起。

    NDB Cluster支持联接下推优化,从而将符合条件的联接完整地发送到NDB Cluster数据节点,在该节点之间可以将其分布并并行执行。有关此优化的更多信息,请参见 NDB下推连接的条件。

    优化查询的主要考虑因素是:

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

      对于使用联接和外键之类的功能引用不同表的查询,索引尤其重要。您可以使用该EXPLAIN语句来确定用于的索引SELECT。请参见“ MySQL如何使用索引”和“使用EXPLAIN优化查询”。

    • 隔离和调整查询的任何部分,例如函数调用,这些过程会花费大量时间。根据查询的结构,可以对结果集中的每一行调用一次函数,甚至可以对表中的每一行调用一次函数,从而极大地提高了效率。
    • 最小化查询中全表扫描的次数,尤其是对于大表。
    • 通过ANALYZE TABLE定期使用该语句来使表统计信息保持最新,因此优化器具有构造有效执行计划所需的信息。
    • 了解特定于每个表的存储引擎的调整技术,索引技术和配置参数。双方InnoDBMyISAM有两套准则的实现和维持查询高性能。有关详细信息,请参见“优化InnoDB查询”和“优化MyISAM查询”。
    • 您可以InnoDB使用“优化InnoDB只读事务”中的技术优化表的单查询事务。
    • 避免以难以理解的方式转换查询,尤其是在优化程序自动执行某些相同转换的情况下。
    • 如果使用基本准则之一不能轻松解决性能问题,请通过阅读EXPLAIN计划并调整索引,WHERE子句,连接子句等来调查特定查询的内部详细信息。(当您达到一定的专业水平时,阅读EXPLAIN计划可能是每个查询的第一步。)
    • 调整MySQL用于缓存的内存区域的大小和属性。通过有效地使用InnoDB缓冲池,MyISAM键高速缓存和MySQL查询高速缓存,重复查询的运行速度更快,因为第二次及其后的结果是从内存中检索的。
    • 即使对于使用缓存区域快速运行的查询,您也可能会进一步优化,以使它们需要更少的缓存,从而使您的应用程序更具可伸缩性。可伸缩性意味着您的应用程序可以处理更多的并发用户,更大的请求等,而不会导致性能大幅下降。
    • 处理锁定问题,其中其他会话同时访问表可能会影响查询速度。