SELECT语句优化

来自泡泡学习笔记
跳到导航 跳到搜索

查询以SELECT语句的形式执行数据库中的所有查找操作。调优这些语句是首要任务,无论是为了实现动态网页的次秒级响应时间,还是为了大幅缩短生成大型夜间报告所需的时间。


除了SELECT语句,查询的调优技术也适用于诸如CREATE TABLE...AS SELECT、INSERT INTO...SELECT和DELETE语句中的WHERE子句等构造。这些语句有额外的性能考虑,因为它们将写操作与面向读取的查询操作结合在一起。


NDB Cluster支持联接推送优化,其中符合条件的联接操作会完整地发送到NDB Cluster数据节点,然后在它们之间进行分布并并行执行。有关此优化的更多信息,请参见NDB推送联接的条件。


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


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


索引对于涉及不同表的查询特别重要,使用诸如联接和外键等功能。您可以使用EXPLAIN语句确定哪些索引用于SELECT查询。


  • 隔离和调优查询中任何耗时过长的部分,例如函数调用。根据查询的结构,函数可能会针对结果集中的每一行调用一次,甚至对表中的每一行调用一次,从而极大地放大任何低效性。


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


  • 定期使用ANALYZE TABLE语句保持表统计信息的最新状态,以便优化器具有构建高效执行计划所需的信息。


  • 了解针对每个表的存储引擎的调优技术、索引技术和配置参数。InnoDB和MyISAM都有一套指南,用于启用和维持查询的高性能。


  • 可以使用“优化InnoDB只读事务”中的技术,对InnoDB表的单个查询事务进行优化。


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


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


  • 调整MySQL用于缓存的内存区域的大小和属性。通过有效利用InnoDB缓冲池、MyISAM键缓存和MySQL查询缓存,重复查询在第二次和后续次数从内存中检索结果,从而运行更快。


  • 即使对于使用缓存内存区域运行快速的查询,您可能仍然可以进一步优化,使其需要更少的缓存内存,从而使您的应用程序具有更好的可伸缩性。可伸缩性意味着您的应用程序可以处理更多并发用户、更大的请求等,而不会出现性能大幅下降。


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