Fijaos en este código, que saca los tres últimos productos de
determinado subtipo y con plan completo:
@productos_guia = Producto.find(:all, :order => “productos.created_at
desc”, :limit => 3, :include => :images, :conditions =>
“productos.subtipo_id IN (81, 82, 83, 84, 85, 86, 87) and
productos.plan_completo”)
Detecto que la SQL va algo lenta, asà que opto por añadir en MySQL un
Ãndice para los campos en cuestión: subtipo_id, plan_completo y
created_at. Y fijaos mi sorpresa al repasar las SQLs generadas:
Producto Load IDs For Limited Eager Loading
(0.036371)
SELECT id FROM productos
WHERE (productos.subtipo_id IN (81, 82, 83,
84, 85, 86, 87) and productos.plan_completo) ORDER BY
productos.created_at desc LIMIT 3e
Producto Load Including Associations
(0.237125)
SELECT […] FROM productos
LEFT OUTER JOIN images
ON
images.producto_id = productos.id WHERE (productos.subtipo_id IN (81,
82, 83, 84, 85, 86, 87) and productos.plan_completo) AND productos
.id
IN (35694, 35628, 35626) ORDER BY productos.created_at desc
Primero hace un eager loading, no sé bien por qué, pero que pasa por el
Ãndice que he definido y va rápido…
Pero después, en la SQL buena, me mete un filtrado por todas las
condiciones Y ADEMÃS POR ID, con lo que ya no pasa por mi Ãndice y
vuelve a ir lenta. Pero es que es un filtrado estúpido: si con el eager
loading ha cargado las IDs, basta con filtrar por IDs, sobrarÃa el
filtrado por subtipo_id y plan_completo. O si no, que deje sólo el
filtrado por subtipo_id y plan_completo, que ya está optimizado, y no
añada también el filtrado por ID… y se salte la optimización!!
¿Esto es un fallo de programación del Rails (2.0.2, en mi caso), o es
que deberÃa haberle pasado alguna condición que no le estoy pasando?
s2