2009-09-09 5 views
1

J'étais curieux depuis que je l'ai lu dans un doc. Est-ce que l'écriturePlacer des colonnes d'index à gauche d'une instruction mysql WHERE?

select * from CONTACTS where id = ‘098’ and name like ‘Tom%’; 

vitesse la requête en opposition à

select * from CONTACTS where name like ‘Tom%’ and id = ‘098’; 

Le premier a une colonne indexée sur le côté gauche. Est-ce que cela accélère réellement les choses ou est-ce la superstition?

en utilisant PHP et MySQL

+0

Comme d'autres l'ont indiqué, MySQL ne se soucie pas de la commande. Mais je me souviens d'Oracle (il y a longtemps, peut-être que ce n'est plus un problème) de devoir jouer avec l'ordre de la clause where pour l'utiliser correctement. Je ne manque pas ces jours-ci ... – nathan

Répondre

2

Vérifiez les plans de requête avec explain. Ils devraient être exactement les mêmes.

0

Ceci est purement superstition. Je ne vois aucune raison pour que l'une ou l'autre des requêtes diffère en vitesse. Si c'était une requête OR plutôt qu'une requête ET cependant, je pourrais voir que l'avoir sur la gauche peut spped des choses.

0

question intéressante, j'ai essayé cette fois. les plans de requête sont les mêmes (en utilisant EXPLAIN).

mais compte tenu de court-circuit-évaluation je me demandais aussi pourquoi il n'y a pas de différence (ou ne mysql une évaluation complète des états booléens?)

0

Vous peut être mal remémoration ou mal lire autre chose, en ce qui concerne de quel côté les caractères génériques sont sur une chaîne littérale dans un prédicat Like. En plaçant le caractère générique sur la droite (comme dans l'exemple précédent), le moteur de recherche peut utiliser les index qui peuvent exister sur la colonne de la table que vous recherchez (dans ce cas, le nom). Mais si vous mettez le caractère générique à gauche,

select * from CONTACTS where name like ‘%Tom’ and id = ‘098’; 

alors le moteur ne peut pas utiliser un index existant et doit faire un scan de table complet.

Questions connexes