10.5 Comment MySQL optimise les clauses WHERE

(Cette section est incomplète, car MySQL effectue de nombreuses optimisations.)

En général, lorsque vous voulez accélérer le traitement d'une commande SELECT ... WHERE, le premier reflexe a avoir est de regarder si il n'est pas possible d'ajouter un index. Toutes les références entre tables devraient utiliser des index. Vous pouvez utiliser la commande EXPLAIN déterminer quels index sont utilisés au cours d'une commande SELECT. EXPLAIN.

Une partie des optimisations de MySQL sont présentées ci-dessous :@:

((a AND b) AND c OR (((a AND b) AND (c AND d))))
-> (a AND b AND c) OR (a AND b AND c AND d)
(a<b AND b=c) AND a=5
-> b>5 AND b=c AND a=5
(B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
-> B=5 OR B=6

Toutes les tables suivantes sont utilisées comme des tables constantes :@:

mysql> SELECT clean_docs_mysql clean_docs-php debut.php fin.php index.php menu.php mysql php FROM t WHERE primary_key=1;
mysql> SELECT clean_docs_mysql clean_docs-php debut.php fin.php index.php menu.php mysql php FROM t1,t2
WHERE t1.primary_key=1 AND t2.primary_key=t1.id;

Quelques exemples de requête très rapides :@:

mysql> SELECT COUNT(*) FROM nom_table;
mysql> SELECT MIN(key_part1),MAX(key_part1) FROM nom_table;
mysql> SELECT MAX(key_part2) FROM nom_table
WHERE key_part_1=constant;
mysql> SELECT ... FROM nom_table
ORDER BY key_part1,key_part2,... LIMIT 10;
mysql> SELECT ... FROM nom_table
ORDER BY key_part1 DESC,key_part2 DESC,... LIMIT 10;

Les requête suivantes sont résolues en utilisant uniquement l'arbre d'index (on supposera que toutes les colonnes indexées sont numériques)


mysql> SELECT key_part1,key_part2 FROM nom_table WHERE key_part1=val;
mysql> SELECT COUNT(*) FROM nom_table
WHERE key_part1=val1 AND key_part2=val2;
mysql> SELECT key_part2 FROM nom_table GROUP BY key_part1;

Les requêtes suivantes sont indexées pour retourner les lignes classées, sans nécessiter de clause de classement :@:

mysql> SELECT ... FROM nom_table ORDER BY key_part1,key_part2,...
mysql> SELECT ... FROM nom_table ORDER BY key_part1 DESC,key_part2 DESC,...