Optimiser la négation Comparaison entre != et NOT()

lundi 30 décembre 2002 :: perrick :: MySQL :: un commentaire :: aucun trackback

Plongé dans le refactoring d'openTIME, j'en profite pour faire quelques tests sur mes requêtes SQL. Cette fois-ci, il s'agit de comparer "!=" et "NOT()".

Concrètement ça donne :

"SELECT name, user_id FROM project WHERE id != 1"

contre

"SELECT name, user_id FROM project WHERE NOT(id = 1)"

Après un test en local (W2K + Apache 1.3.24 + PHP 4.2.0 + MySQL 3.23.39), puis sur 2 serveurs différents, le résultat est là : "!=", 2,35 s. contre "NOT()", 2,52 s. (moyenne sur 20 éxécutions du script de test). Ce n'est peut-être pas un gain de temps énorme sur les 1000 itérations du code mais c'est toujours ça de pris.

Si vous avez d'autres trucs SQL (ou MySQL), n'hésitez pas à les partager : les commentaires sont là pour ça aussi.

Mais où est donc OR par rapport à IN ?

vendredi 8 novembre 2002 :: perrick :: MySQL :: aucun commentaire :: aucun trackback

Il y a quelques temps en épluchant la doc MySQL je suis tombé sur un "comparison operator" intéressant : IN.

Il peut remplacer OR dans une commande SQL : ainsi

"SELECT name, user_id FROM project WHERE id IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)"

est équivalent à

"SELECT name, user_id FROM project WHERE id = 1 OR id = 2 OR id = 3 OR id = 4 OR id = 5 OR id = 6 OR id = 7 OR id = 8 OR id = 9 OR id = 10"

Et s'il est plus élégant à mon goût - car plus court, il restait une question en suspens : qui est le lièvre et l'autre la tortue ?
Bilan IN gagne là aussi contre OR : 0.986s contre 1.067s sur 1000 itérations.

PS : il s'agit d'un petit test rapide en local (W2K + Apache 1.3.24 + PHP 4.2.0 + MySQL 3.23.39), pas d'un benchmark complet.