Maison >base de données >tutoriel mysql >Comment puis-je optimiser une requête pour trouver efficacement le maximum de groupe ?
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.
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.
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!