Home >Database >Mysql Tutorial >How Can I Optimize Groupwise Maximum Queries in MySQL and PostgreSQL?

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

Susan Sarandon
Susan SarandonOriginal
2025-01-01 09:58:10297browse

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

Optimizing Groupwise Maximum Query

The provided query, aiming to retrieve records with maximum IDs grouped by option_id, faces performance issues due to scanning all rows. To address this, consider utilizing a programmatic index that stores maximum ID values for each option_id. This approach enables efficient retrieval of maximums by only scanning the index.

Traditional approaches, such as indexing (option_id, id) or (option_id, id DESC), do not adequately optimize the query.

MySQL's Optimization

MySQL 5.5 incorporates an advanced optimization for this query. By indexing (option_id, id), MySQL leverages the index for group-by operations, avoiding the need for sequential scans.

Postgres Optimization with Reference Table

In Postgres, create a reference table, options, with unique option_ids that correspond to distinct option_ids in the records table.

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;

Use a correlated subquery to retrieve maximum IDs from records for each option_id:

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

This approach enables index-only scans, minimizing row access in records. The ideal index for this query:

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

Postgres Optimization with LATERAL Join (Postgres 9.3 )

Alternatively, in Postgres 9.3 and above, use a LATERAL join to achieve a similar optimization:

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;

This approach also leverages index-only scans for efficient query execution.

The above is the detailed content of How Can I Optimize Groupwise Maximum Queries in MySQL and PostgreSQL?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn