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
WHERE est directement lu dans les informations de la table. C'est aussi vrai pour les expression NOT NULL utilisé sur une seule table.
SELECT sont impossibles et retourne aucune ligne.
WHERE si vous n'utilisez pas GROUP BY ou des fonctions de groupage, telles que COUNT(), MIN()...
WHERE plus simple est constituée, pour accélérer l'exécution et abandonner les requêtes les plus tôt possible.
WHERE avec un index UNIQUE ou une PRIMARY KEY, et si toutes les membres de l'index sont utilisé avec des expressions constantes.
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;
ORDER BY et GROUP BY proviennent de la même table, alors cette table est traitée en premier, lors du regroupement) .
ORDER BY et une clause GROUP BY différente, ou si ORDER BY ou GROUP BY contiennent des colonnes d'autres tables que la première table dans la commande de regroupement, une table temporaire est créée.
SQL_SMALL_RESULT, MySQL utilisera une table temporaire en mémoire.
DISTINCT est convertie en GROUP BY sur toutes les colonnes, DISTINCT combiné avec ORDER BY nécessitera la plus part du temps une table temporaire.
HAVING sont ignorés.
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,...