Я знаю больше о mssql, чем mysql, но я не думаю, что количество соединений или количество строк, о которых вы говорите, должно вызвать у вас слишком много проблем с правильными индексами на месте. Проанализировали ли вы план запроса, чтобы убедиться, что вы его пропустили?
http://dev.mysql.com/doc/refman/5.0/en/explain.html
При этом, как только вы довольны своими показателями и исчерпали все другие возможности, правильной ответ может быть ненормализация. Если у вас есть только один или два запроса, которые являются проблемными, вероятно, уместен ручной подход, тогда как какой-то инструмент хранилища данных может быть лучше для создания платформы для разработки кубов данных.
Вот сайт, который я нашел, который затрагивает эту тему:
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;
Для больших запросов это может сэкономить много времени и прояснить, откуда поступили данные, и вы можете повторно использовать запросы, которые у вас уже есть.
Помните, я только защищаю это как последнее средство. Бьюсь об заклад, есть несколько индексов, которые помогут вам. А когда вы нормализуете, не забудьте учесть дополнительное пространство на ваших дисках и выясните, когда вы запустите запрос для заполнения новых таблиц. Это должно быть, вероятно, ночью или когда активность низкая. И данные в этой таблице, конечно же, никогда не будут точно обновлены.
[Еще одно редактирование] Не забывайте, что новые таблицы, которые вы создаете, тоже должны быть проиндексированы! Хорошая часть заключается в том, что вы можете индексировать содержимое своего сердца и не беспокоиться о конфликте блокировки обновления, поскольку помимо массовой вставки в таблице будут отображаться только выборки.