SQL语句优化
数据库应用程序的核心逻辑无论是直接通过解释器发出的,还是通过API在后台提交的都是通过SQL语句执行的。本系列文章中的调优指南有助于加快各种MySQL应用程序的速度。这些指导方针包括读取和写入数据的SQL操作、一般SQL操作的后台开销,以及在特定场景(如数据库监控)中使用的操作。
SELECT语句优化
查询以SELECT语句的形式执行数据库中的所有查找操作。是为动态web页面实现亚秒级的响应时间,还是缩短生成大型夜间报告的时间来看对这些语句进行调优都是应该最优先考虑的优化点。
除了SELECT语句之外,查询的调优技术也适用于CREATE TABLE…AS SELECT, INSERT INTO…SELECT和DELETE语句中的WHERE子句。因为它们将写操作与面向读的查询操作结合起来,所以这些语句的性能应该额外进行考虑。
NDB集群支持一种连接下推优化,通过这种优化,一个符合条件的连接被完整地发送到NDB集群数据节点,在这些节点之间可以分布连接并并行执行。有关此优化的更多信息,会在后面的文章中进行介绍。
优化查询的主要考虑因素是:
- 想让一个很慢的SELECT … WHERE的查询语句变快,第一步就是看看你能不能增加索引,通过增加索引来使语句变快。在WHERE子句中使用的列上设置索引,可以减少计算、过滤和最终检索结果所用的时间。为了避免浪费硬盘空间,可以构造一组索引来加速应用程序中使用的许多相关查询。
- 索引对于使用连接(joins)和外键(foreign keys)等特性引用不同表的查询尤其重要。你可以使用EXPLAIN语句去判断在一个查询语句中使用了哪个索引。后面文集内会有专门的文章来介绍MySQL数据库是怎样应用索引的以及怎样使用EXPLAIN语句去优化查询语句。
- 隔离和调优查询的任何部分,例如花费过多时间的函数调用。根据查询的结构,可以对结果集中的每一行调用一次函数,甚至可以对表中的每一行调用一次函数,这大大提高了效率。
- 减少查询中全表扫描的次数,特别是对于大表。
- 通过定期使用ANALYZE TABLE语句使表统计信息保持最新,使
优化器拥有构建高效执行计划所需的信息。 - 学习针对每个表的存储引擎的调优技术、索引技术和配置参数。InnoDB和MyISAM都有一套用于支持和保持查询高性能的指导原则。后面将有文章单独去介绍每种存储引擎应该如何进行优化和调优。
- 您可以为InnoDB表优化单查询事务。
- 避免以难以理解的方式转换查询,特别是在优化器自动执行某些相同转换的情况下。
- 如果性能问题不容易通过基本指导原则之一解决,那么可以通过阅读EXPLAIN计划并调整索引、WHERE子句、联接子句等来研究特定查询的内部细节。(当达到一定的专业水平时,阅读EXPLAIN计划可能是每个查询的第一步。)
- 调整MySQL用于缓存的内存区域的大小和属性。通过有效地使用InnoDB缓冲池、MyISAM键缓存和MySQL查询缓存,重复查询运行得更快,因为结果是在第二次和以后的时间从内存中检索的。
- 即使对于使用缓存内存区域快速运行的查询,您也可以进一步优化,使其所需的缓存内存更少,从而使应用程序更具可伸缩性。可伸缩性意味着你的应用程序可以处理更多的同步用户、更大的请求等等,而不会导致性能的大幅下降。
- 处理锁定问题,其中查询的速度可能会受到同时访问表的其他会话的影响。