2010-02-27 4 views

Répondre

3

Je ne pense pas qu'il y aura une grande différence entre ces deux requêtes: la différence étant de sélectionner un champ (qui fait partie d'un index) dans le second cas, et compter une ligne dans la première ... Pas tellement de différence. Pourtant, par curiosité, j'ai fait un benchmark très rapide de ces types de requêtes sur une base de données que j'ai sur mon ordinateur - notez qu'il n'y a que 7 lignes dans la table des postes, donc ce n'est peut-être pas proche d'une situation réelle, mais comme il y a un PK sur id, ce qui signifie un index ....

Voici ce que je suis:

mysql> select benchmark(10000000000, 'select sql_no_cache id from post where id = 1'); 
+-------------------------------------------------------------------------+ 
| benchmark(10000000000, 'select sql_no_cache id from post where id = 1') | 
+-------------------------------------------------------------------------+ 
|                  0 | 
+-------------------------------------------------------------------------+ 
1 row in set (1 min 0,25 sec) 

mysql> select benchmark(10000000000, 'select sql_no_cache count(1) from post where id = 1'); 
+-------------------------------------------------------------------------------+ 
| benchmark(10000000000, 'select sql_no_cache count(1) from post where id = 1') | 
+-------------------------------------------------------------------------------+ 
|                    0 | 
+-------------------------------------------------------------------------------+ 
1 row in set (1 min 0,23 sec) 

Donc, vraiment pas beaucoup de différence, il semble ^^

0

La deuxième déclaration est probablement plus rapide. Mais pour des raisons pratiques, la différence sera négligeable

1

Bien que Pascal est correct dans son CV, son exemple est erronée.

benchmark(10000000000, 'select sql_no_cache id from post where id = 1') 

L'énoncé ci-dessus évalue une chaîne une déclaration, et non l'instruction SELECT lui-même. La syntaxe correcte pour la BENCHMARK fonction serait:

benchmark(10000000000, (select sql_no_cache id from post where id = 1)) 

En outre, au moins en MySQL 5.5.22, en utilisant SQL_NO_CACHE dans la déclaration fournie aux résultats REPÈRES une erreur:

mysql> SELECT BENCHMARK(1000000000,(SELECT SQL_NO_CACHE COUNT(1) FROM players WHERE id=1)); 
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'COUNT(1) FROM players WHERE id=1))' at line 1 
mysql> SELECT BENCHMARK(1000000000,(SELECT SQL_NO_CACHE id FROM players WHERE id=1)); 
ERROR 1054 (42S22): Unknown column 'SQL_NO_CACHE' in 'field list' 

Cependant , une expérience avec des instructions réelles, une table d'enregistrement de 40000 et un cache de requêtes désactivé confirment que COUNT fonctionnerait un peu plus rapidement que la récupération de l'ID, même si la différence peut être considérée comme négligeable.

mysql> set query_cache_type=0; 
Query OK, 0 rows affected (0.00 sec) 
mysql> SELECT SQL_NO_CACHE benchmark(1000000000,(SELECT id FROM test WHERE id=1)); 
+-----------------------------------------------------------+ 
| benchmark(1000000000,(SELECT id FROM players WHERE id=1)) | 
+-----------------------------------------------------------+ 
|               0 | 
+-----------------------------------------------------------+ 
1 row in set (23.17 sec) 

mysql> SELECT SQL_NO_CACHE benchmark(1000000000,(SELECT COUNT(1) FROM test WHERE id=1)); 
+-----------------------------------------------------------------+ 
| benchmark(1000000000,(SELECT COUNT(1) FROM players WHERE id=1)) | 
+-----------------------------------------------------------------+ 
|                0 | 
+-----------------------------------------------------------------+ 
1 row in set (22.50 sec) 
Questions connexes