Wiem więcej o mssql niż mysql, ale nie sądzę, że liczba złączeń lub liczba wierszy, o których mówisz, powinna powodować zbyt wiele problemów z poprawnymi indeksami. Czy przeanalizowałeś plan zapytań, aby zobaczyć, czy czegoś brakuje?
http://dev.mysql.com/doc/refman/5.0 /pl/wyjaśnij.html
Biorąc to pod uwagę, kiedy jesteś zadowolony ze swoich indeksów i wyczerpałeś wszystkie inne możliwości, denormalizacja może być właściwą odpowiedzią. Jeśli masz tylko jedno lub dwa zapytania, które sprawiają problemy, prawdopodobnie odpowiednie jest podejście ręczne, podczas gdy jakiś rodzaj narzędzia do hurtowni danych może być lepszy do stworzenia platformy do tworzenia kostek danych.
Oto strona, którą znalazłem, która porusza ten temat:
http://www.meansandends.com /mysql-data-warehouse/?link_body%2Fbody=%7Bincl%3AAaggregacja%7D
Oto prosta technika, której możesz użyć, aby zachować prostotę denormalizacji zapytań, jeśli wykonujesz tylko kilka naraz (i nie zastępuję tabel OLTP, tylko tworzę nową do celów raportowania). Załóżmy, że masz w swojej aplikacji to zapytanie:
select a.name, b.address from tbla a
join tblb b on b.fk_a_id = a.id where a.id=1
Możesz utworzyć zdenormalizowaną tabelę i wypełnić ją prawie tym samym zapytaniem:
create table tbl_ab (a_id, a_name, b_address);
-- (types elided)
Zauważ, że podkreślenia pasują do aliasów tabeli, których używasz
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
Następnie, aby naprawić aplikację tak, aby korzystała z nowej zdenormalizowanej tabeli, zamień kropki na podkreślenia.
select a_name as name, b_address as address
from tbl_ab where a_id = 1;
W przypadku ogromnych zapytań pozwala to zaoszczędzić dużo czasu i wyjaśnia, skąd pochodzą dane, a także możesz ponownie wykorzystać zapytania, które już masz.
Pamiętaj, że popieram to tylko jako ostateczność. Założę się, że jest kilka indeksów, które mogą ci pomóc. A kiedy denormalizujesz, nie zapomnij uwzględnić dodatkowego miejsca na dyskach i dowiedzieć się, kiedy uruchomisz zapytanie, aby wypełnić nowe tabele. Powinno to mieć miejsce w nocy lub gdy aktywność jest niska. Dane w tej tabeli oczywiście nigdy nie będą aktualne.
[Kolejna edycja] Nie zapominaj, że nowe tabele, które tworzysz, również muszą być zaindeksowane! Dobrą stroną jest to, że możesz indeksować według treści swojego serca i nie martwić się o rywalizację o blokadę aktualizacji, ponieważ poza wstawianiem zbiorczym tabela zobaczy tylko wybrane.