Rendimiento en el orden de las consultas SQL
El otro día mientras jugaba con unas consultas SQL se me ocurrió la siguiente pregunta:
El orden de las condiciones afecta al rendimiento de la consulta?
Quería comprobar si aquello de que el orden de los factores no afecta al producto se cumplía también en el rendimiento de las consultas SQL. Decidí probarlo en mi servidor local de MySQL.
Creo la tabla:
CREATE TABLE `ficha` (
`id` int(11) NOT NULL auto_increment,
`nombre` varchar(100) NOT NULL default ”,
`apellido1` varchar(100) NOT NULL default ”,
`apellido2` varchar(100) NOT NULL default ”,
`idioma` varchar(2) NOT NULL default ”,
`estado` int(1) NOT NULL default ’0′,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
Con un script en PHP añado 1000 registros aleatorios y ejecuto 3 veces cada consulta para evitar picos puntuales:
SELECT id, nombre, apellido1, apellido2 FROM ficha WHERE idioma = ‘ca’ AND estado = 1
#1: 0.0014 seg
#2: 0.0006 seg
#3: 0.0006 seg
SELECT id, nombre, apellido1, apellido2 FROM ficha WHERE estado = 1 AND idioma = ‘ca’
#1: 0.0015 seg
#2: 0.0006 seg
#3: 0.0006 seg
Conclusiones:
Salvo una pequeña variación de 0,0001 segundos las 2 consultas tardan exactamente lo mismo en ser ejecutadas, por lo que puedo ‘afirmar’ [*] que el orden de las condiciones no afecta al rendimiento.
[*] ¡ Ojo ! La prueba la he realizado con unos pocos registros en una tabla muy sencilla, ignoro totalmente lo que puede pasar con estructuras más complejas y con mayor volumen de datos. Si esto no fuera así por favor, no me arrojéis al gran conejo asesino xD
- Publicado por admin a las 03:16 pm
- Permalink de esta entrada
- Guardado en: Bases de datos
- Comentarios RSS de esta entrada
- TrackBack URI
Como bien dices, 1000 registros son muy pocos y no vas a notar diferencia, y lanzar 3 veces la misma consulta no te servirá de mucho si no le marcas que no tire de la caché ;)
Tecnicamente, el orden de las clausulas en el where si importa, lo más optimo en cuanto a velocidad sería colocar primero las clausulas que trabajen sobre indices.
La realidad, es que mysql trae un optimizador de consultas con el que te va a dar igual colocarlo de un modo u otro.
Saludos.
Muy interesante Antonio! Muchas gracias por la respuesta :)