Я знаю больше о mssql о том, что mysql, но я не думаю, что количество объединений или количество строк, о которых вы говорите, должно вызывать слишком много проблем с правильными индексами на месте. Вы проанализировали план запроса, чтобы узнать, нет ли у вас каких-либо проблем?
http://dev.mysql.com/doc/refman/5.0/en/explain.html
Это, как говорится, как только вы satisifed с индексами и исчерпаны все другие возможности, денормализация может быть правильным ответом. Если у вас есть только один или два запроса, которые являются проблемами, возможно, подходит для ручного подхода, тогда как какой-то инструмент хранилища данных может быть лучше для создания платформы для разработки кубов данных.
Вот сайт, я обнаружил, что касается по теме:
http://www.meansandends.com/mysql-data-warehouse/?link_body%2Fbody=%7Bincl%3AAggregation%7D
Вот простой метод, который можно использовать, чтобы держать денормализации запросы просто, если вы просто делаете несколько в то время (и я не заменяю ваши OLTP-таблицы, просто создавая новую для целей отчетности). Допустим, у вас есть этот запрос в приложении:
select a.name, b.address from tbla a
join tblb b on b.fk_a_id = a.id where a.id=1
Вы можете создать денормализованную таблицу и почти с таким же запросом:
create table tbl_ab (a_id, a_name, b_address);
-- (types elided)
Обратите внимание на знак подчеркивание соответствуют псевдонимам таблиц, которые вы используете
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
Затем, чтобы исправить ваше приложение, чтобы использовать новую денормализованную таблицу, переключите точки для подчеркивания.
select a_name as name, b_address as address
from tbl_ab where a_id = 1;
Для огромных запросов это может сэкономить много времени и дает понять, где данные пришли, и вы можете повторно использовать запросы, которые уже есть.
Помните, что я только защищаю это как последнее средство. Бьюсь об заклад, есть несколько указателей, которые помогут вам. И когда вы де-нормализуете, не забывайте учитывать дополнительное пространство на ваших дисках и выясните, когда вы запустите запрос, чтобы заполнить новые таблицы. Вероятно, это должно быть ночью или когда активность низкая. И данные в этой таблице, конечно, никогда не будут точно обновлены.
[Еще одно редактирование] Не забывайте, что новые таблицы, которые вы создаете, также должны быть проиндексированы! Хорошая часть заключается в том, что вы можете индексировать контент вашего сердца и не беспокоиться о конкуренции блокировки обновлений, так как помимо вашей объемной вставки таблица увидит только избранные.