Ho un dizionario inglese in un database MySQL con oltre 250.000 voci e sto usando un semplice front-end ruby per cercarlo utilizzando i caratteri jolly all'inizio del stringhe. Finora ho fatto in questo modo:Metodo rapido (er) per la ricerca con caratteri jolly di stringhe 250K +
SELECT * FROM words WHERE word LIKE '_e__o'
o anche
SELECT * FROM words WHERE word LIKE '____s'
So sempre la lunghezza esatta della parola, ma tutti, ma un singolo carattere sono potenzialmente sconosciuto.
Questo è più lento di melassa, circa quindici volte più lento di una query simile senza il carattere jolly iniziale perché non è possibile utilizzare l'indice per la colonna.
Ho provato alcuni metodi per restringere l'ambito della ricerca. Ad esempio, ho aggiunto 26 colonne aggiuntive contenenti i conteggi delle singole lettere di ogni parola e ristretto la ricerca utilizzando quelli per primi. Ho anche provato a restringere in base alla lunghezza delle parole. Questi metodi non hanno fatto praticamente alcuna differenza, grazie all'inefficienza intrinseca delle ricerche con caratteri jolly principali. Ho sperimentato la dichiarazione REGEXP, che è ancora più lenta.
SQLite e PostgreSQL sono limitati come MySQL e, sebbene io abbia esperienza limitata con i sistemi NoSQL, la mia ricerca mi dà l'impressione che eccellano in termini di scalabilità, non di prestazioni del tipo di cui ho bisogno.
La mia domanda quindi, è dove dovrei cercare una soluzione? Devo continuare a cercare un modo per ottimizzare le mie query o aggiungere colonne supplementari che possano restringere il mio potenziale recordset? Esistono sistemi progettati specificamente per eseguire una ricerca rapida con caratteri jolly in questo filone?
Probabilmente si desidera esplorare le opzioni FTS (ricerca testo completo). SQLite FTS4 funziona bene nella mia esperienza, non so gli altri. – ergosys
Tutte le query (lente) di questo tipo? 'parola LIKE '__e_b__on''? –
@ergosys: da quello che ho capito, MySQL fts non è in grado di eseguire ricerche con caratteri jolly iniziali su singole parole. – Daniel