sql: joins vs multiple selects

Pese a que el saber popular dice que hacer un select multiple*(1) versus un select con joins*(2) es mas lento.

*(1) SELECT link_id,sum(vote_value) FROM links,votes WHERE link_id=vote_link_id AND vote_type=’links’ AND vote_value>0 AND link_date > DATE_SUB(NOW(), INTERVAL 1 year) GROUP BY link_id
*(2) SELECT link_id,sum(vote_value) FROM links INNER JOIN votes ON (link_id=vote_link_id AND vote_type=’links’ AND vote_value>0) WHERE link_date > DATE_SUB(NOW(), INTERVAL 1 year) GROUP BY link_id

Para sacarme la duda cree una script que crea usuarios, enlaces, comentarios y votos (positivos y negativos) en meneame.

Luego tome las diferentes queries que usaban multiples tablas para el calculo del karma (el archivo /scripts/karma9.php) y las compare con las joins, en todas las consultas agregue el prefijo SQL_NO_CACHE

El resultado final contra todo lo que esperaba fue no concluyente…
Seletcs multiples total took: 587
Selects joins total took: 600

Como no me gusta rendirme facilmente elimine todos los indices y corri de nuevo los test. Obteniendo el siguiente resultado;
Seletcs multiples total took: 118023
Selects joins total took: 117221

A tener en cuenta, las consultas siempre fueron hechas entre dos tablas, si fueran de mas tablas segun la documentacion de sql: nested joins

Conclusion
Como conclusion podemos afirmar que los indices vamos a lograr consultas muy rapidas, pero esto se paga, los inserts, deletes y updates de una campo indice van a ser mas lentos, debido a que los indices deben ser regenerados. Tambien se paga con espacio ya que los indices ocupan memoria.

Advertisement

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s