MySQL优化(3):SELECT 语句优化概述
数据库应用程序的核心逻辑是通过 SQL 语句执行的,无论是通过解释器直接发出的,还是通过API在后台提交的。
查询以 SELECT 语句的形式执行数据库中的所有查找操作。调整这些语句是重中之重,无论是实现动态网页的次秒响应时间,还是缩短生成大量夜间报告的时间。
本系列文章的调优指南有助于提高各种 MySQL 应用程序的速度。这些指南包括读写数据的 SQL 操作、一般SQL操作的后台开销,以及在特定场景(如数据库监视)中使用的操作。
除了 SELECT 语句外,查询的调优技术还适用于诸如 CREATETABLE…as SELECT
、INSERT INTO…SELECT
和 DELETE
语句中的 WHERE子
句等构造。这些语句有额外的性能考虑,因为它们将写操作与面向读的查询操作结合起来。
NDB Cluster 支持 join
下推优化,将符合条件的 join 整体发送到 NDB Cluster 数据节点,在这些节点之间可以分布并并行执行。有关此优化的详细信息,参考 Conditions for NDB pushdown joins。
SELECT优化考虑因素
优化查询的主要考虑因素有:
要使慢速
SELECT ... WHERE
查询更快,首先要检查是否可以添加索引。在 WHERE 子句中使用的列上设置索引,以加快评估、过滤和结果的最终检索。 为避免浪费磁盘空间,请构建一小组索引以加速应用程序中使用的许多相关查询。
索引对于使用连接和外键等功能引用不同表的查询尤其重要。 可以使用 EXPLAIN 语句来确定哪些索引用于 SELECT。
隔离 和 调整查询 的任何部分,例如函数调用,这需要过多的时间。
根据查询的结构方式,可以为结果集中的每一行调用一次函数,甚至可以为表中的每一行调用一次函数,这大大放大了任何低效率。
最小化查询中的全表扫描数,特别是对于大表。
通过定期使用
ANALYZE TABLE
语句使表统计信息保持最新,以便优化器拥有构建高效执行计划所需的信息。了解特定于每个表的存储引擎的调优技术、索引技术和配置参数。
InnoDB 和 MyISAM 都有一套指导方针来启用和维持查询的高性能。
可以使用
优化 InnoDB 只读事务
中的技术优化 InnoDB 表的单查询事务。避免以难以理解的方式转换查询,特别是当优化器自动执行某些相同的转换时。
如果性能问题不能通过基本准则之一轻松解决,请通过阅读
EXPLAIN
计划并调整索引、WHERE
子句、连接子句等来调查特定查询的内部细节。(当达到一定的专业水平时,阅读 EXPLAIN 计划可能是您每次查询的第一步)
调整 MySQL 用于缓存的内存区域的大小和属性。
通过有效使用 InnoDB 缓冲池、MyISAM 键缓存和 MySQL 查询缓存,重复查询运行得更快,因为结果是从内存中检索的第二次和后续时间。
即使对于使用高速缓存区域快速运行的查询,仍然可以进一步优化,以便它们需要更少的高速缓存,从而使您的应用程序更具可扩展性。
可扩展性意味着您的应用程序可以处理更多并发用户、更大的请求等,而不会导致性能大幅下降。
处理锁定问题,其中查询速度可能会受到同时访问表的其他会话的影响。
SELECT优化细分
- WHERE 子句优化
- 范围优化
- 索引合并优化
- Hash Join 优化
- 引擎条件下推优化
- 索引条件下推优化
- 嵌套循环连接算法
- 嵌套连接优化
- 外连接优化
- 外连接简化
- 多范围读取优化
- 阻止嵌套循环和批量密钥访问联接
- 条件过滤
- 恒定折叠优化
- IS NULL 优化
- ORDER BY 优化
- GROUP BY 优化
- DISTINCT 优化
- LIMIT 查询优化
- 函数调用优化
- 行构造函数表达式优化
- 避免全表扫描
MySQL优化(3):SELECT 语句优化概述
http://blog.gxitsky.com/2021/07/06/MySQL-Optimization-03-Select/