2013-07-27 17 views
5

Ho un database mysql in cui gli utenti possono inserire testo. Devono quindi essere in grado di cercare questo testo. Ho appena implementato la ricerca full text su mysql e ha reso le ricerche molto più veloci.Ricerca full-text di MySQL: necessità di inserimento rapido e ricerca veloce

Tuttavia, non ha sorprendentemente reso gli inserti più lenti. Ma sono rimasto sorpreso da quanto è più lento. Un singolo inserto può richiedere 0,5 - 1,5 secondi.

La tabella ha 3 colonne indicizzate:

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

ho solo circa 2000 record nella tabella a questo punto, che non è nulla rispetto a quello che sarà in seguito.

Qualche suggerimento? Come viene gestito normalmente questo problema? È normale che un inserto impieghi così tanto tempo?

Non ho bisogno di tutte le funzionalità di ricerca a testo integrale. Ho solo bisogno dell'equivalente di AND, OR, -, +, "". Quindi niente pesi ecc. L'indicizzazione può essere girata per renderla più veloce?

+7

di MySQL 'indici FULLTEXT', in virtù del fatto che sono sempre in sincronia con i dati, rallenta davvero la scrittura sul tuo tavolo. Esistono soluzioni di terze parti, come [Solr] (http://lucene.apache.org/solr/) o [Sphinx] (http://sphinxsearch.com/), che si collegano al tuo database e creano i propri indici (separato per la modifica dei dati) e quindi non influisce sulle prestazioni di scrittura di MySQL. La presentazione di Bill Karwin [Full Text Search Throwdown] (http://www.slideshare.net/billkarwin/practical-full-text-search-with-my-sql) è un eccellente confronto tra le opzioni. – eggyal

+0

Sfinge appena installata. È meraviglioso. Utilizzando l'indicizzazione rt. Inserimenti e ricerche veloci. – user984003

risposta

2

Risposta basata sul commento di eggyal.

Ho finito per installare Sfinge. È meraviglioso. Sto usando la sua indicizzazione in tempo reale. Ricerca veloce e inserimento veloce. Molto più veloce di mysql inserimento/ricerca di testo libero. Certo, il mio database è piuttosto piccolo. Hanno trucchi per l'indicizzazione veloce in tempo reale con grandi database (divisi in 2 indici, uno con vecchi dati, uno con dati più recenti), ma non ne ho avuto bisogno.

BTW: sto usando Python/Django e non c'è bisogno di installare alcun api o libreria, oltre sfinge stessa:

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