60 mln rekordów sphinx i najtańszy VPS?

Odpowiedz Nowy wątek
2015-07-27 21:55

Rejestracja: 6 lat temu

Ostatnio: 3 lata temu

0

Cześć,

mam bazę póki co 15mln rekordów varchar - unikalne ciągi tekstowe. Potrzebuję wyszukiwać słów słownikowych + odmian danego słowa w tych wierszach, poniżej jedno z wykonywanych zapytań(sphinx):

SELECT * FROM `song_row` WHERE MATCH(:'@(content) \"być\"|\"być\"|\"bądź\"|\"bądźcie\"|\"bądźcież\"|\"bądźmy\"|\"bądźmyż\"|\"bądźże\"|\"będą\"|\"będąc\"|\"będąca\"|\"będącą\"|\"będące\"|\"będącego\"|\"będącej\"|\"będącemu\"|\"będący\"|\"będących\"|\"będącym\"|\"będącymi\"|\"będę\"|\"będzie\"|\"będziecie\"|\"będziemy\"|\"będziesz\"|\"bycia\"|\"byciach\"|\"byciami\"|\"bycie\"|\"byciem\"|\"byciom\"|\"byciu\"|\"byli\"|\"byliby\"|\"bylibyście\"|\"bylibyśmy\"|\"byliście\"|\"byliśmy\"|\"był\"|\"była\"|\"byłaby\"|\"byłabym\"|\"byłabyś\"|\"byłam\"|\"byłaś\"|\"byłby\"|\"byłbym\"|\"byłbyś\"|\"byłem\"|\"byłeś\"|\"było\"|\"byłoby\"|\"były\"|\"byłyby\"|\"byłybyście\"|\"byłybyśmy\"|\"byłyście\"|\"byłyśmy\"|\"byto\"|\"jest\"|\"jestem\"|\"jesteś\"|\"jesteście\"|\"jesteśmy\"|\"niebędąca\"|\"niebędącą\"|\"niebędące\"|\"niebędącego\"|\"niebędącej\"|\"niebędącemu\"|\"niebędący\"|\"niebędących\"|\"niebędącym\"|\"niebędącymi\"|\"niebycia\"|\"niebyciach\"|\"niebyciami\"|\"niebycie\"|\"niebyciem\"|\"niebyciom\"|\"niebyciu\"|\"niebyć\"|\"są\"') GROUP BY `song_id`

przy takim zapytaniu sphinx na dysku SSD i 8GB RAM wykonuje się w ok. 7sekund + drugie tyle jakbym chciał zrobić counta dla paginacji. 14 sekund to jeszcze nie jest tragicznie jak na tak zawiłe zapytanie, tak mi się wydaje przynajmniej, tylko że cały projekt początkowo stanie na najtańszym VPS-ie 512MB/1GB RAM dysk 7200obr./min i obawiam się że tam ww. zapytanie może się wykonywać w 20 sekund jak nie więcej przy małym obciążeniu. Co o tym myślicie, da radę?

Dane techniczne:

  • MySQL
    tabela relacyjna InnoDB
    całkowita wielkość tabeli 60mln rekordów typu varchar

Pozostało 580 znaków

Krzywy Orzeł
2015-07-27 22:31
Krzywy Orzeł
0

Szanowny forumowiczu,
trudno będzie z takim VPS'em.

Z SSD'kiem lepiej znacznie moim zdaniem. Polecam zatem wybrać najtańszą opcję z DigitalOcean za pięć dolców na miesiąc dostaniesz coś takiego:
512 mb ram, 1 rdzeń, dysk SSD.

Dużej różnicy cenowej pewnie nie będzie w porównaniu z obecną propozycją na magnetycznym nośniku, a szybkość znacznie wzrośnie.

Pozostało 580 znaków

2015-07-28 11:41

Rejestracja: 8 lat temu

Ostatnio: 10 godzin temu

0

szybko to będzie jak będziesz miał tyle ramu, żeby Ci się w nim cała baza zmieściła (chociaż nie wiem czy mysql jest na tyle mądry aby takie myki robić)


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
Ramdisk ma sens na windowsach gdzie zarządzanie pamięcią ssie, linux ma memory caching. Ramdisk znacznie podniesie ryzyko utraty danych. Nie zdziwiłbym się gdyby takie rozwiązanie było nawet wolniejsze od dysku ssd... - _naf 2015-07-28 11:52
ale kto mówi o ramdysku??? Baza potrafi załadować się do ramu i stamtąd czynić odczyty - abrakadaber 2015-07-28 21:12

Pozostało 580 znaków

2015-07-28 12:07

Rejestracja: 12 lat temu

Ostatnio: 2 godziny temu

0
  1. Robisz GROUP BY ? Po co? Strasznie zwalnia, a jest niepotrzebne.
  2. Na INNODb robisz MATCH? Chyba że masz wersję MySQL> 5.6.4, bo niższe nie wspierają FTS na InnoDb. Jak nie masz FTS na tym polu, to se poczekasz...
  3. Gdybyś jednak zmienił Engine na MySQL, to mógłbyś korzystać z FOUND_ROWS (gdzieś znalazłem info, że to tylko na MySQL chodzi)
  4. Poza tym jeśli stronicujesz to pomyślałbym na twoim miejscu, by to procedura wykonywała twoje zapytanie do jakiejś tabeli tymczasowej (np. typu MEMORY), bo kolejny odczyt (nastepnej paczki) był błyskawiczny...

Pozostało 580 znaków

2015-07-28 13:14

Rejestracja: 6 lat temu

Ostatnio: 3 lata temu

0
Marcin.Miga napisał(a):
  1. Robisz GROUP BY ? Po co? Strasznie zwalnia, a jest niepotrzebne.

Dla sphinx GROUP BY to odpowiednik DISTINCT w MySQL'u

Marcin.Miga napisał(a):
  1. Gdybyś jednak zmienił Engine na MySQL, to mógłbyś korzystać z FOUND_ROWS (gdzieś znalazłem info, że to tylko na MySQL chodzi)

Będę musiał spróbować

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0