Maison > base de données > tutoriel mysql > Comment puis-je optimiser les requêtes maximales Groupwise dans MySQL et PostgreSQL ?

Comment puis-je optimiser les requêtes maximales Groupwise dans MySQL et PostgreSQL ?

Susan Sarandon
Libérer: 2025-01-01 09:58:10
original
282 Les gens l'ont consulté

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

Optimisation de la requête maximale Groupwise

La requête fournie, visant à récupérer les enregistrements avec un maximum d'ID regroupés par option_id, est confrontée à des problèmes de performances en raison de l'analyse de tous rangées. Pour résoudre ce problème, envisagez d'utiliser un index programmatique qui stocke les valeurs d'ID maximales pour chaque option_id. Cette approche permet une récupération efficace des maximums en analysant uniquement l'index.

Les approches traditionnelles, telles que l'indexation (option_id, id) ou (option_id, id DESC), n'optimisent pas correctement la requête.

Optimisation de MySQL

MySQL 5.5 intègre une optimisation avancée pour cela requête. En indexant (option_id, id), MySQL exploite l'index pour les opérations de regroupement, évitant ainsi le besoin d'analyses séquentielles.

Optimisation Postgres avec table de référence

Dans Postgres , créez une table de référence, des options, avec des options_ids uniques qui correspondent à des option_ids distincts dans les enregistrements 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;
Copier après la connexion

Utilisez une sous-requête corrélée pour récupérer le maximum d'ID des enregistrements pour chaque 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;
Copier après la connexion

Cette approche permet des analyses d'index uniquement, minimisant ainsi l'accès aux lignes dans les enregistrements. L'index idéal pour cette requête :

CREATE INDEX ON records (option_id, id DESC NULLS LAST);
Copier après la connexion

Optimisation Postgres avec jointure LATERAL (Postgres 9.3)

Alternativement, dans Postgres 9.3 et supérieur, utilisez une jointure LATERAL pour réaliser une optimisation similaire :

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;
Copier après la connexion

Cette approche exploite également analyses d'index uniquement pour une exécution efficace des requêtes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal