Witam,
Mam pewien problem z którym borykam się już dłuższy czas. Otóż próbuję zaprojektować dość dużą bazę danych, która w sumie posiada mniej więcej 15 milionów rekordów we wszystkich tabelach.
Jest to baza z ofertami turystycznymi, gdzie oprócz nazwy oferty, kraju, regionu, miasta i nazwy hotelu są dostępne terminy i ich ceny z różnymi dodatkowymi informacjami. Z tymi właśnie danymi jest problem ponieważ tych terminów jest bardzo dużo (~ 7 mln rekordów), a poza tym trzeba po nich przeszukiwać.
Największym problemem są duplikaty, dlatego że potrzebuję wyświetlić jeden termin dla jednej oferty, gdzie używając DISTINCTA lub GROUP BY jest bardzo czasochłonne.
Wszelkie podjęte działania w celu optymalizacji zapytań są nieskuteczne, nie pomagają nawet indeksy.
Podzapytania są również bardzo wolne. Wszelkie próby zwiększenia pamięci dla mySQL'a też nie przynoszą dużych przyśpieszeń.
Nieskuteczne stają się metody grupowania (Loose index scan, Tight index scan), które owszem są szybkie, ale ograniczają się do pobrania danych z kolumn, które później są grupowane wg. indeksów, a ja muszę pobrać dużo więcej kolumn w zapytaniu lub nawet łączyć niektóre kolumny z innych tabel.
Zastanawiam się czy to nie zbyt duża baza na jeden serwer, który też nie jest pierwszej młodości czy może mySql nie nadaje się do takich baz.
Gdybym mógł pobrać lub złączyć jakoś dane z tabel oferty i terminy wg. przeszukiwania po terminach wg. kilku kryteriów i wyeliminować duplikaty nie używając GROUP BY czy DISTINCT.
Uproszczona struktura tych 2 tabel to:
[tabela OFERTY]
- id
- nazwa
- kod hotelu
- kraj
- region
- miasto
[tabela TERMINY]
- id
- data_wyjazdu
- ilosc_dni
- cena
- kod_hotelu [relacja]
- wyzywienie
Macie może jakieś pomysły jak to zoptymalizować?