Conozco más sobre mssql que mysql, pero no creo que el número de uniones o el número de filas de las que está hablando deba causar demasiados problemas con los índices correctos en su lugar. ¿Has analizado el plan de consulta para ver si te falta alguno?
http://dev.mysql.com/doc/refman/5.0/en/explain.html
Dicho esto, una vez que esté satisfecha con sus índices y han agotado todas las demás vías, 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 sobre el tema:
http://www.meansandends.com/mysql-data-warehouse/?link_body%2Fbody=%7Bincl%3AAggregation%7D
Aquí es una técnica sencilla que se puede utilizar para mantener consultas desnormalización simple, si sólo está haciendo unos pocos a la vez (y no reemplazaré sus tablas OLTP, solo crearé una nueva para fines de informes). Digamos que usted 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
Se puede crear una tabla sin normalizar y poblar con casi la misma consulta:
create table tbl_ab (a_id, a_name, b_address);
-- (types elided)
Aviso a los guiones bajos coinciden con los alias de tabla que utiliza
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 y 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 enormes Esto puede ahorrar mucho tiempo y hace que sea claro dónde vienen los datos, y se puede volver a utilizar las consultas que ya tiene.
Recuerda, solo defiendo esto como último recurso. Apuesto a que hay algunos índices que te pueden ayudar. Y cuando se desincronice, no se olvide de tener en cuenta el espacio adicional en sus discos, y descubra cuándo ejecutará la consulta para rellenar las nuevas tablas. Esto probablemente debería ser por la noche o cuando la actividad sea baja. Y los datos en esa tabla, por supuesto, nunca estarán exactamente actualizados.
[Otra edición más] ¡No olvide que las nuevas tablas que crea deben ser indexadas también! Lo bueno es que puede indexar al contenido de su corazón y no preocuparse por la contención del bloqueo de actualización, ya que, aparte de su inserción masiva, la tabla solo verá selecciones.