OT: Sobre optimización de SQL - era : Top 100 mundial y optimización

El día 13 de octubre de 2008 12:11, Fernando C.
[email protected]
escribió:> (que yo sepa, y he probado bastantes cosas).

Probablemente, la no-optimización del motor se debe a que no entiende de
ingeniería social, y piensa que las probabilidades de que yo me guarde a
un usuario que ha escrito un mensaje son iguales que las de que yo me
guarde al tío que más escribe; pero en realidad, no es así… y cuanto
más probable sea que me guarde al tío que más escribe, mejor será el
enfoque por fecha (rápidamente encontraré los 25 primeros de mis
favoritos) y peor el enfoque por usuario (la cantidad de contenidos de
mis usuarios favoritos será muy grande).

Me tomé la libertad de cambiar el asunto, ya que nos estamos desviando
del general y de ROR.

El motor no entiende de ingeniería social es una gran verdad, pero la
otra verdad es que la ingeniería social no entiende acerca de
almacenamiento y diseño para RDBMS. Je!

Supongo que estás usando MYSQL. No conozco en profundidad
cómotrabaja, pero creo que puedo trasladar mi experiencia con PostgreSQL
al caso. El motor lo que hace es buscar entre sus estadísticas la
mejor forma de acceder a los datos. El mismo query, con distintos
filtros, no tiene el mismo plan. Yo creo que si ajustás los índices,
el motor va a encontrar el mejor plan para el 100% los casos…

Si tu usuario tiene mucho movimiento, el mejor plan es recorrer
descendentemente por fecha de creación y verificar si corresponde o no
al usuario filtrado, tal cual como estás haciéndolo. Supongo que este
es el plan que se ejecutará en el 99% de tus casos, por lo cual es
válido que lo fuerces.

Pero si tu usuario tiene poco movimiento (imaginemos unos 1000
registros), quizás el mejor plan es seleccionar todos los registros
del usuario, para luego ordenarlos por fecha de creación en forma
descendente. Este plan se ejecutará muy pocas veces, quizás sólo para
los bots de buscadores, pero te aseguro que será instantáneo.

Si te interesa un poco el tema y tenés tiempo de investigar, probá de
meterle los índices que te digo (usuario_id), actualizar las
estadísticas y ver qué plan genera para ambos casos (y postear el
resultado de la prueba, que al menos a mí me interesa el tema).

Saludos!
Silvio