2013-07-27 7 views
5

Mam bazę danych mysql, w której użytkownicy mogą wprowadzać tekst. Następnie muszą mieć możliwość wyszukania tego tekstu. Właśnie zaimplementowałem wyszukiwanie pełnotekstowych mysql i zdecydowanie przyspieszyło wyszukiwanie.Wyszukiwanie za pomocą pełnego tekstu MySQL: potrzeba szybkiego wstawiania i szybkiego wyszukiwania.

Jednak nie dziwi, że wkładki są wolniejsze. Ale byłem zaskoczony, jak wolniej. Pojedyncza wkładka może trwać od 0,5 do 1,5 sekundy.

tabela ma 3 indeksowanych kolumn:

title (max length 200) 
description (max length 3000) 
content (max length 10000) 

Mam tylko około 2000 rekordów w tabeli w tym momencie, co jest niczym w porównaniu do tego, co będzie później.

Wszelkie sugestie? W jaki sposób problem jest zwykle rozwiązywany? Czy to normalne, że wkładka zajmuje tak długo?

Nie potrzebuję wszystkich możliwości wyszukiwania pełnotekstowego. Po prostu potrzebuję odpowiednika AND, OR, -, +, "". Więc nie ma ciężarów itp. Czy to indeksowanie można zmienić, aby było szybsze?

+7

MySQL 'indeksy FULLTEXT', ze względu na fakt, że są one zawsze zsynchronizowane z danymi, rzeczywiście spowalnia zapisywanie do stołu. Istnieją rozwiązania innych firm, takie jak [Solr] (http://lucene.apache.org/solr/) lub [Sphinx] (http://sphinxsearch.com/), które łączą się z bazą danych i budują własne indeksy (oddzielne od modyfikacji danych) i dlatego nie wpływają na wydajność zapisu MySQL. Prezentacja Billa Karwina [Przekreślenie pełnego tekstu] (http://www.slideshare.net/billkarwin/practical-full-text-search-with-my-sql) to doskonałe porównanie opcji. – eggyal

+0

Właśnie zainstalowany sfinks. To jest zajebiste. Korzystanie z indeksowania rt. Szybkie wstawianie i wyszukiwanie. – user984003

Odpowiedz

2

Odpowiedź na podstawie komentarza eggyal.

Skończyłem instalowanie Sphinx. To jest zajebiste. Używam indeksowania w czasie rzeczywistym. Szybkie wyszukiwanie i szybkie wstawianie. O wiele szybszy niż mysql-free-text insert/search. To prawda, moja baza danych jest dość mała. Mają sztuczki do szybkiego indeksowania w czasie rzeczywistym z dużymi bazami danych (podzielonymi na 2 indeksy, jeden ze starymi danymi, jeden z nowszymi danymi), ale nie potrzebowałem tego.

BTW: Używam Python/Django i nie nie trzeba instalować żadnego API lub biblioteki, oprócz samego sfinks:

import MySQLdb 
connection = MySQLdb.connect(host='127.0.0.1', port = 9306) 
cursor = connection.cursor() 
cursor.execute("select id from my_index where match('stackoverflow')") 
results = cursor.fetchall() 
# I use my regular connection to insert the IDs into a table in my regular database and then join with that to get actual data. 
Powiązane problemy