Je viens d'effectuer de nouveaux tests de rapidité sur une table de 10000 entrées (en testant sur un renvoi de : 100, 500, 2000 puis 5000). la première méthode est la plus rapide (en moyenne 2 fois plus rapide que la méthode 2 - combinaison SQL/PHP - en fonction du nombre de valeurs à renvoyer qui en croissant donne nettement l'avantage à la méthode 1).
La méthode 3 est la plus lente voir problématique sur de grandes valeurs.
La méthode 4 qui semble fonctionner uniquement avec les versions de MySQL => 5.0.21 est sensiblement aussi rapide que la méthode 1.
1 - tri numérique sur age puis alphabétique sur prenom par SQL avec un subselect :
2 - tri numérique sur age par SQL puis tri alphabétique sur prenom par PHP :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT individu_list.* FROM (SELECT mt.* FROM my_table mt ORDER BY mt.age DESC LIMIT 2000) AS individu_list ORDER BY individu_list.prenom;
3 - tri numérique sur age puis alphabétique sur prenom par SQL avec une auto jointure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <?php $query = "SELECT mt.* FROM my_table mt ORDER BY mt.age DESC LIMIT 2000; $result = mysql_query($query); if (mysql_num_rows($result)) {<div style="margin-left:40px">while ($row = mysql_fetch_array($result)) {<div style="margin-left:40px">$individu_list[] = $row;</div>} function sortByName($a, $b) {<div style="margin-left:40px">if ($a['prenom'] == $b['prenom']) return 0; return ($a['prenom'] < $b['prenom']) ? -1 : 1;</div>} usort($individu_list, 'sortByName');</div>} ?>
4 - tri numérique sur age puis alphabétique sur prenom par SQL avec un double ORDER BY (MySQL => 5.0.21) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SELECT mt1.id,mt1.prenom,mt1.age,count(*) AS rank FROM my_table mt1 INNER JOIN my_table mt2 ON mt1.age <= mt2.age GROUP BY mt1.id,mt1.prenom,mt1.age HAVING rank <=2000 ORDER BY prenom;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 (SELECT * FROM my_table mt ORDER BY mt.age DESC LIMIT 2000) ORDER BY prenom;
Partager