2013-05-22 17 views
6

Mam tabelę mającą 14 milionów wierszy i próbuję wykonać wyszukiwanie pełnotekstowe na tej tabeli. Zapytanie o to działa bardzo wolno, zajmuje około 9 sekund dla prostej kwerendy binarnej AND. Te same rzeczy są natychmiast wykonywane w mojej prywatnej klastrze. Rozmiar tej tabeli wynosi około 3,1 GB i zawiera 14 milionów wierszy. Czy ktoś może wyjaśnić to zachowanie instancji RDS?Wyszukiwanie za pomocą MySQL Pełne wyszukiwanie bardzo wolno na dużej instancji AWS RDS

SELECT count(*) 
FROM table_name WHERE id=97 
AND match(body) against ('+data +big' IN BOOLEAN MODE) 
+0

proszę zaksięgować quey – Stephan

+0

Czy możesz porównać plan wykonania w obu środowiskach? Opublikuj je, jeśli są różne. – RandomSeed

+0

'SELECT Explain' pokazujący te same rzeczy na obu maszynach. – user883499

Odpowiedz

3

Wysoki wskaźnik IO często oznacza niewystarczającą ilość pamięci lub zbyt małe bufory. Tabela o pojemności 3 GB, w tym indeksy, powinna całkowicie zmieścić się w pamięci serwera (o wartości znacznie mniejszej niż 500 $ za pół miesiąca).

MySQL ma wiele różnych buforów, a jako many parameters służy do grania. Poniższe bufory są najważniejsze, porównać ich rozmiary w dwóch środowiskach:

Jeśli InnoDB: innodb_buffer_pool_size

Jeżeli MyISAM: key_buffer_size i read_buffer_size

0

masz dodany FULLTEXT index na body kolumnie jeśli nie to spróbuj tego na pewno to zrobi dużą różnicę

ALTER TABLE `table_name` ADD FULLTEXT INDEX `bodytext` (`body`); 

Nadzieja pomaga

+0

Tak, istnieje już pełny indeks tekstowy. – user883499

0

Spróbuj

SELECT count(1) 
FROM table_name WHERE id=97 
AND match(body) against ('+data +big' IN BOOLEAN MODE) 

To powinno przyspieszyć trochę, ponieważ nie musisz liczyć wszystkich col umns tylko rzędy.

Czy możesz zamieścić to wyjaśnienie?

+0

Co to jest minimalna długość słowa? Czy to możliwe, że tak duży jest stopword, więc jego jedynym wyszukiwaniem na danych słownych? –

0

Ponieważ wersja DB, tabela, indeksy i plany wykonania są takie same, należy porównać konfiguracje maszyny/klastra. Główne punkty porównania: dostępna moc procesora, rdzenie używane w pojedynczej transakcji, szybkość odczytu pamięci, rozmiar pamięci i prędkość odczytu/częstotliwość. Widzę, że Amazon oferuje różne konfiguracje, więc być może prywatny klaster jest o wiele potężniejszy niż konfiguracja instancji Amazon RDS.

Aby dodać do powyższego, można wyrównać obciążenie między procesorem, we/wy i pamięcią, aby zwiększyć przepustowość.

0

Korzystanie match() przed() wykonać badania w poprzek cały twój pełnotekstowy indeks 3GB i nie ma sposobu na wymuszenie innego indeksu w tym przypadku.

Aby przyspieszyć zapytanie, czego potrzeba, aby twój wskaźnik pełny lżejsze, dzięki czemu można:

1 - oczyścić wszystkie niepotrzebne znaki i stopwords z indeksu pełnotekstowego

2 - tworzenie wielu indeksów pełnotekstowych i zerknąć odpowiedni: 3) zmienić wyszukiwanie pełnotekstowe na klauzulę LIKE i wymusić inny indeks, taki jak "identyfikator".

0

Spróbuj umieścić identyfikator indeksu tekstowego i powiedzieć:

meczu (ciało, ID) przed (+ Big Data + +97) oraz id = 97

Można również spojrzeć na sfinksa, który może być używane z mysql łatwo.

Powiązane problemy