Sé más sobre mssql que mysql, pero no creo que la cantidad de uniones o la cantidad de filas de las que está hablando le cause demasiados problemas con los índices correctos en su lugar. ¿Has analizado el plan de consultas para ver si te falta alguna?
http://dev.mysql.com/doc/refman/5.0 /es/explicar.html
Dicho esto, una vez que esté satisfecho con sus índices y haya agotado todas las demás vías, la desnormalización podría ser la respuesta correcta. Si solo tiene una o dos consultas que son problemas, probablemente sea apropiado un enfoque manual, mientras que algún tipo de herramienta de almacenamiento de datos podría ser mejor para crear una plataforma para desarrollar cubos de datos.
Aquí hay un sitio que encontré que toca el tema:
http://www.meansandends.com /mysql-data-warehouse/?link_body%2Fbody=%7Bincl%3AAggregation%7D
Aquí hay una técnica simple que puede usar para mantener la desnormalización de consultas simples, si solo está haciendo algunas a la vez (y no estoy reemplazando sus tablas OLTP, solo creando una nueva para fines de informes). Digamos que tiene esta consulta en su aplicación:
select a.name, b.address from tbla a
join tblb b on b.fk_a_id = a.id where a.id=1
Podría crear una tabla desnormalizada y completarla con casi la misma consulta:
create table tbl_ab (a_id, a_name, b_address);
-- (types elided)
Observe que los guiones bajos coinciden con los alias de la tabla que usa
insert tbl_ab select a.id, a.name, b.address from tbla a
join tblb b on b.fk_a_id = a.id
-- no where clause because you want everything
Luego, para arreglar su aplicación para usar la nueva tabla desnormalizada, cambie los puntos por guiones bajos.
select a_name as name, b_address as address
from tbl_ab where a_id = 1;
Para consultas grandes, esto puede ahorrar mucho tiempo y deja en claro de dónde provienen los datos, y puede reutilizar las consultas que ya tiene.
Recuerde, solo estoy defendiendo esto como último recurso. Apuesto a que hay algunos índices que te ayudarían. Y cuando desnormalice, no olvide tener en cuenta el espacio adicional en sus discos y averiguar cuándo ejecutará la consulta para completar las nuevas tablas. Esto probablemente debería ser por la noche, o cuando la actividad sea baja. Y los datos de esa tabla, por supuesto, nunca estarán exactamente actualizados.
[Otra edición más] ¡No olvide que las nuevas tablas que cree también deben indexarse! Lo bueno es que puede indexar el contenido de su corazón y no preocuparse por la contención de bloqueo de actualización, ya que, aparte de su inserción masiva, la tabla solo verá selecciones.