Maison >base de données >tutoriel mysql >Comment puis-je optimiser une requête pour trouver efficacement le maximum de groupe ?

Comment puis-je optimiser une requête pour trouver efficacement le maximum de groupe ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-26 10:51:10573parcourir

How Can I Optimize a Query to Efficiently Find the Groupwise Maximum?

Requête optimisée pour un maximum de groupe efficace

Problème d'origine :

La requête

select * 
from records 
where id in ( select max(id) from records group by option_id )

effectue une analyse séquentielle de l'ensemble de la table d'enregistrements pour déterminer l'ID maximum pour chaque option_id. Cette approche est inefficace, en particulier pour les grandes tables.

Solution : jointure latérale

Une solution consiste à exploiter une jointure latérale pour récupérer l'ID maximum pour chaque option_id dans la sous-requête :

select r.*
from records r
cross join lateral (
    select max(id) as max_id
    from records
    where option_id = r.option_id
) m
where r.id = m.max_id

Cette requête utilise une jointure latérale pour calculer l'ID maximum dans une sous-requête distincte. Le résultat est joint à la table d'enregistrements d'origine pour filtrer uniquement les lignes avec l'ID maximum.

Création d'un index spécialisé

Une autre optimisation consiste à créer un index spécialisé sur la table d'enregistrements qui stocke l'ID maximum pour chaque option_id :

CREATE INDEX idx_max_id ON records (option_id, max(id))

Cet index permet une recherche directe de l'ID maximum pour un option_id donné, éliminant ainsi le besoin de l'original sous-requête :

select * 
from records r
where (option_id, id) in (
    select option_id, max(id) from records group by option_id
)

L'approche basée sur l'index réduit considérablement le nombre d'accès aux tables, ce qui rend la requête plus efficace pour les grandes tables.

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!

Déclaration:
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