Maison > base de données > tutoriel mysql > Comment récupérer efficacement la valeur maximale et les données correspondantes d'une grande table de base de données SQL ?

Comment récupérer efficacement la valeur maximale et les données correspondantes d'une grande table de base de données SQL ?

Susan Sarandon
Libérer: 2025-01-07 17:21:41
original
724 Les gens l'ont consulté

How to Efficiently Retrieve the Maximum Value and Corresponding Data from a Large SQL Database Table?

Rechercher efficacement les valeurs maximales et les données associées dans de grandes tables SQL

Souvent, les requêtes de base de données nécessitent de trouver la valeur maximale dans une colonne et de récupérer les données correspondantes dans d'autres colonnes de la même ligne. Cela est particulièrement difficile avec de très grands ensembles de données. Considérons un tableau nécessitant de trouver le numéro de version le plus élevé pour chaque identifiant unique, ainsi que sa balise associée :

Exemple de tableau :

<code>ID  |  tag  |  version
-----+-----+-----
1 |  A  |  10
2 |  A  |  20
3 |  B  |  99
4 |  C  |  30
5 |  F  |  40</code>
Copier après la connexion

Résultat souhaité :

<code>ID  |  tag  |  version
-----+-----+-----
2  |  A  |  20
3  |  B  |  99
4  |  C  |  30
5  |  F  |  40</code>
Copier après la connexion

Pour les tables comportant environ 28 millions de lignes, les méthodes standard telles que les instructions SELECT imbriquées ou les GROUP BY simples avec MAX peuvent être incroyablement lentes. Une solution beaucoup plus efficace utilise la ROW_NUMBER()fonction window :

SELECT s.id, s.tag, s.version
FROM (
  SELECT t.*,
         ROW_NUMBER() OVER(PARTITION BY t.id ORDER BY t.version DESC) AS rnk
  FROM YourTable t
) s
WHERE s.rnk = 1;
Copier après la connexion

Cette requête fonctionne en deux étapes :

  1. Requête interne : Elle attribue un rang unique (rnk) à chaque ligne au sein de chaque ID partition (groupe de lignes avec le même ID). Le classement est basé sur la colonne version par ordre décroissant, ce qui signifie que la version la plus élevée obtient le rang 1.

  2. Requête externe : Elle filtre les résultats de la requête interne, en sélectionnant uniquement les lignes où rnk = 1. Cela nous donne effectivement la ligne avec le maximum version pour chaque ID.

Cette approche évite les requêtes imbriquées et les GROUP BY opérations, ce qui la rend nettement plus rapide pour les grands ensembles de données. L'utilisation de ROW_NUMBER() fournit un moyen propre et efficace d'obtenir le résultat souhaité.

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 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