Eu sei mais sobre mssql que mysql, mas não acho que o número de junções ou o número de linhas que você está falando deve causar muitos problemas com os índices corretos no lugar. Você analisou o plano de consulta para ver se está faltando algum?
http://dev.mysql.com/doc/refman/5.0 /en/explain.html
Dito isto, uma vez que você esteja satisfeito com seus índices e tenha esgotado todos os outros caminhos, a desnormalização pode ser a resposta certa. Se você tiver apenas uma ou duas consultas que são problemas, uma abordagem manual provavelmente é apropriada, enquanto algum tipo de ferramenta de armazenamento de dados pode ser melhor para criar uma plataforma para desenvolver cubos de dados.
Aqui está um site que encontrei que aborda o assunto:
http://www.meansandends.com /mysql-data-warehouse/?link_body%2Fbody=%7Bincl%3AAggregation%7D
Aqui está uma técnica simples que você pode usar para manter a desnormalização de consultas simples, se você estiver fazendo apenas algumas de cada vez (e não estou substituindo suas tabelas OLTP, apenas criando uma nova para fins de relatório). Digamos que você tenha esta consulta em seu aplicativo:
select a.name, b.address from tbla a
join tblb b on b.fk_a_id = a.id where a.id=1
Você pode criar uma tabela desnormalizada e preencher com quase a mesma consulta:
create table tbl_ab (a_id, a_name, b_address);
-- (types elided)
Observe que os sublinhados correspondem aos aliases de tabela que você 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
Em seguida, para corrigir seu aplicativo para usar a nova tabela desnormalizada, troque os pontos por sublinhados.
select a_name as name, b_address as address
from tbl_ab where a_id = 1;
Para consultas grandes, isso pode economizar muito tempo e deixar claro de onde vieram os dados, e você pode reutilizar as consultas que já possui.
Lembre-se, estou defendendo isso apenas como último recurso. Aposto que há alguns índices que o ajudariam. E quando você desnormalizar, não se esqueça de considerar o espaço extra em seus discos e descobrir quando você executará a consulta para preencher as novas tabelas. Isso provavelmente deve ser à noite, ou sempre que a atividade estiver baixa. E os dados dessa tabela, é claro, nunca estarão exatamente atualizados.
[Mais uma edição] Não esqueça que as novas tabelas que você cria também precisam ser indexadas! A parte boa é que você pode indexar o conteúdo do seu coração e não se preocupar com a contenção de bloqueio de atualização, pois além de sua inserção em massa, a tabela verá apenas seleções.