Mam słownik języka angielskiego w bazie danych MySQL z nieco ponad 250 000 wpisów i używam prostego rubinowego interfejsu do wyszukiwania za pomocą symboli wieloznacznych na początku smyczki. Do tej pory robiłem to tak:Szybka (er) metoda wyszukiwania wieloznacznego 250K + ciągi znaków
SELECT * FROM words WHERE word LIKE '_e__o'
lub nawet
SELECT * FROM words WHERE word LIKE '____s'
zawsze wiem dokładną długość słowa, ale wszyscy, ale pojedynczym znakiem są potencjalnie nieznane.
Jest wolniejszy niż melasa, około piętnaście razy wolniejszy niż podobne zapytanie bez wiodącej symbolu wieloznacznego, ponieważ nie można użyć indeksu dla kolumny.
Próbowałem kilka metod, aby zawęzić zakres wyszukiwania. Na przykład dodałem 26 dodatkowych kolumn zawierających liczbę liter każdego słowa i zawęzić wyszukiwanie przy użyciu tych pierwszych. Próbowałem również zwężania według długości słowa. Te metody nie robiły prawie żadnej różnicy, dzięki nieodłącznym nieskutecznym wyszukiwaniom prowadzącym do symboli wieloznacznych. Eksperymentowałem z instrukcją REGEXP, która jest jeszcze wolniejsza.
SQLite i PostgreSQL są tak samo ograniczone jak MySQL i choć mam ograniczone doświadczenie z systemami NoSQL, moje badania dają mi wrażenie, że wyróżniają się skalowalnością, a nie wydajnością, jakiej potrzebuję.
Moje pytanie brzmi: gdzie powinienem szukać rozwiązania? Czy powinienem nadal próbować znaleźć sposób na zoptymalizowanie moich zapytań lub dodać dodatkowe kolumny, które mogą zawęzić mój potencjalny zestaw rekordów? Czy istnieją systemy zaprojektowane specjalnie do szybkich poszukiwań w tym dziale?
Prawdopodobnie chcesz zbadać opcje FTS (wyszukiwanie pełnotekstowe). SQLite FTS4 działa dobrze w moim doświadczeniu, dunno o innych. – ergosys
Czy wszystkie twoje (wolne) zapytania tego typu? 'słowo LIKE '__e_b__on''? –
@ergosys - z tego co rozumiem, fis MySQL nie może wykonywać wiodących wyszukiwań wieloznacznych na pojedynczych słowach. – Daniel