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

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
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.

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ć)

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...
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ć

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