SQL : Accélérer un SELECT significativement

Vous connaissez probablement ce type de requête qui permet de faire un SELECT WHERE column IN (value,value,value) :

Ce type de requête permet donc de récupérer les données où la valeur d'un champ est contenue dans un tableau de valeurs.
Quand le tableau de valeurs contient plusieurs centaines de valeurs, la requête peut prendre un certain temps.

Il existe une autre façon d'écrire cette requête et celle-ci prendra infiniment moins de temps, ceci même avec plusieurs milliers de valeurs.

Pour l'exemple, nous allons utiliser la même requête en passant dans le tableau de valeurs des id de 1 à 1000.
Nous allons générer le tableau de valeurs en PHP comme ci-dessous :

La requête traditionnelle, utilisant IN donnerait alors ceci :

Si on fait un print_r() de la requête :

Cette requête peut prendre du temps surtout si la table product contient beaucoup de colonnes et si de plus on utilise des jointures pour récupérer des colonnes d'autres tables, comme c'est souvent le cas.

Pour accélérer la requête, il suffira alors de réécrire notre tableau $values de cette façon :

Chaque id est alors mis entre parenthèses et la requête sera alors transformée en :

On fait à nouveau un print_r() de la requête :

Vous noterez WHERE id = ANY ( VALUES (1), (2), (...) )

Il m'est arrivé de faire des requêtes en passant des milliers d'id. La vitesse d'exécution est sans commune mesure.