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
Release: 2025-01-01 09:58:10
Original
277 people have browsed it

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;
Copy after login

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;
Copy after login

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);
Copy after login

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;
Copy after login

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!

source:php.cn
Statement of this Website
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
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template