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