查询,以 SELECT 语句的形式,执行数据库中的所有查询操作。无论是为了实现动态网页的亚秒级响应时间,还是为了缩短生成巨大的隔夜报告的时间,调整这些语句是重中之重。
除了 SELECT 语句,查询的调整技术也适用于 CREATE TABLE...AS SELECT
、INSERT INTO...SELECT
和 DELETE
语句的 WHERE
子句等结构。这些语句有额外的性能考虑,因为它们结合了写操作和面向读的查询操作。
NDB Cluster 支持一个连接推倒的优化,根据这个优化,一个合格的连接被完整地发送到 NDB Cluster 数据节点,在那里它可以被分布在这些节点中并被并行执行。关于这个优化的更多信息,请参阅 NDB 推倒连接的条件。
优化查询的主要考虑因素是:
- 为了使缓慢的
SELECT ... WHERE
查询变得更快,首先要检查的是 是否可以添加索引。在 WHERE 子句中使用的列上设置索引,以加快评估、过滤和最终检索结果的速度。为了避免浪费磁盘空间,构建一个小的索引集,以加速你的应用程序中使用的许多相关查询。
索引对于使用连接和外键等功能引用不同表的查询特别重要。你可以使用 EXPLAIN
语句来确定哪些索引被用于 SELECT。见第 8.3.1 节 MySQL 如何使用索引 和第 8.8.1 节 用 EXPLAIN 优化查询。
隔离和调整查询的任何部分,如函数调用,这需要过多的时间。根据查询的结构,一个函数可能为结果集中的每一条记录调用一次,甚至为表中的每一条记录调用一次,这将大大放大任何低效率。
在你的查询中尽量减少 全表扫描 的数量,特别是对于大表。
通过定期使用 ANALYZE TABLE 语句来保持表的统计信息的更新,这样优化器就有了构建高效执行计划所需的信息。
了解每个表的存储引擎所特有的调整技术、索引技术和配置参数。InnoDB 和 MyISAM 都有一套准则来实现和维持查询的高性能。详情请见第 8.5.6 节 优化 InnoDB 查询 和第 8.6.1 节 优化 MyISAM 查询。
你可以使用第 8.5.3 节 优化 InnoDB 只读事务 中的技术,为 InnoDB 表优化单次查询事务。
避免以使查询难以理解的方式进行转换,特别是在优化器自动进行一些相同的转换时。
如果一个性能问题不容易通过一个基本的准则来解决,通过阅读 EXPLAIN 计划和调整你的索引、WHERE 子句、连接子句等来研究特定查询的内部细节。(当你达到一定的专业水平时,阅读 EXPLAIN 计划可能是你对每个查询的第一步。)
调整 MySQL 用于缓存的内存区域的大小和属性。通过有效地使用 InnoDB 缓冲池、MyISAM 密钥缓存和 MySQL 查询缓存,重复查询运行得更快,因为第二次和以后的结果都是从内存中检索的。
即使是使用缓存内存区域的查询运行得很快,你仍然可能进一步优化,使它们需要更少的缓存内存,使你的应用程序更具可扩展性。可扩展性意味着你的应用程序可以处理更多的同步用户,更大的请求,等等,而不会出现性能大降的情况。
处理锁的问题,你的查询速度可能会受到其他会话同时访问表的影响。