首页 >数据库 >mysql教程 >如何优化 MySQL 和 PostgreSQL 中的分组最大查询?

如何优化 MySQL 和 PostgreSQL 中的分组最大查询?

Susan Sarandon
Susan Sarandon原创
2025-01-01 09:58:10278浏览

How Can I Optimize Groupwise Maximum Queries in MySQL and PostgreSQL?

优化分组最大查询

提供的查询旨在检索按 option_id 分组的最大 ID 记录,由于扫描所有记录而面临性能问题行。为了解决这个问题,请考虑使用存储每个 option_id 的最大 ID 值的编程索引。这种方法只需扫描索引即可高效检索最大值。

传统方法,例如索引 (option_id, id) 或 (option_id, id DESC),不能充分优化查询。

MySQL 的优化

MySQL 5.5 为此引入了高级优化 询问。通过索引 (option_id, id),MySQL 利用索引进行分组操作,避免了顺序扫描的需要。

Postgres 使用参考表优化

在 Postgres 中,创建一个参考表 options,其具有与记录中不同 option_ids 相对应的唯一 option_ids

CREATE TABLE options ( option_id INT PRIMARY KEY, option TEXT UNIQUE NOT NULL );

INSERT INTO options SELECT DISTINCT option_id, 'option' || option_id FROM records;

使用相关子查询从记录中检索每个 option_id 的最大 ID:

SELECT option_id, (SELECT MAX(id) FROM records WHERE option_id = o.option_id) AS max_id
FROM options o
ORDER BY 1;

此方法支持仅索引扫描,最大限度地减少记录中的行访问。此查询的理想索引:

CREATE INDEX ON records (option_id, id DESC NULLS LAST);

Postgres Optimization with LATERAL Join (Postgres 9.3 )

或者,在 Postgres 9.3 及更高版本中,使用 LATERAL join 来实现类似的优化:

SELECT *
FROM records
LATERAL (
  SELECT MAX(id) OVER (PARTITION BY option_id) AS max_id
  FROM records
) AS m
WHERE records.id = m.max_id;

这种方法也利用仅索引扫描来高效执行查询。

以上是如何优化 MySQL 和 PostgreSQL 中的分组最大查询?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn