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.