Быстрый поиск подстроки по базе

M
На сайте с 04.08.2008
Offline
80
4595

Передо мной встала проблема: быстрый поиск подстроки в базе. На первый взгляд показалост все просто. Итак...

Исходник: CSV файл с более чем 4,5 млн записей. Само собой без индекса поиск происходит очень медленно: в течении около 5-7 секунд. Так как нужно обрабатывать несколько сотен тысяч запросов это непозволительно долго на один запрос.Встал вопрос перевода в базу данных с индексами.

Первое, что пришло в голову: MySQL. Итак, перевел таблицу в дамп .SQL и залил на сервер.

Но запросы типа

LIKE %SUBSTRING%
оказались еще медленней (10-25 секунд): такие запросы не могут использовать индексы (?!).

Следующая идея: использовать полнотекстовый поиск. (подстрока может содержать только цифробуквенный символы и знак '-', поэтому для FULLTEXT, казалось, самое то) Создал FULLTEXT индекс. И вот уже казалось победа близка. Планировал делать запросы в MySQL:

MATCH FIELD1 AGAINST ('*SUBSTRING*' IN BOOLEAN MODE)
. Поиск происходит сотые доли секунды! НО... как оказалось шаблон *SUBSTRING* в полнотекстовом поиске использовать нельзя! Можно только так: SUBSTRING* (то есть ищет любое слово начинающееся с SUBSTRING.).

Итак, вопрос к спецам MySQL: что можно сделать? Можно ли? Какие еще несложные манипуляции с базой можно проделать, чтобы решить такую вроде бы простую проблему: быстрый поиск подстроки в базе.

Заранее благодарю за любые советы и подсказки

A
На сайте с 19.07.2010
Offline
130
#1
Muhandis:
Исходник: CSV файл с более чем 4,5 млн записей. Само собой без индекса поиск происходит очень медленно: в течении около 5-7 секунд.

Как искали? Обычный grep пробовали?

grep "SUBSTRING" file.csv

После первого вызова файл закешируется и последующие поиски будут быстрее. Ну или для надежности положить файл в рам (tmpfs).

LIKE - не использует индексы.

Muhandis:
подстрока может содержать только цифробуквенный символы и знак '-', поэтому для FULLTEXT, казалось, самое то

Как вариант, соэдать дополнительное текстовое поле(или varchar), которое будет содержать только "цифробуквенный символы и знак '-'" разделяемые пробелами, если их несколько. Именно по этому полю и делать полнотекстовый поиск.

.............
LEOnidUKG
На сайте с 25.11.2006
Offline
1722
#2
LIKE - не использует индексы.

Использует, но в таком формате как у ТС, не использует.

Может быть обходной вариант?

http://www.sql.ru/forum/430173/kolichestvo-vhozhdeniy-podstroki-v-stroku

---------- Добавлено 30.03.2015 в 12:04 ----------

Ещё предлагают использовать готовые функции:

http://myrusakov.ru/how-to-find-substring-in-string-sql.html

---------- Добавлено 30.03.2015 в 12:05 ----------

И вообще ищите в гугле, там много всяких интересных решений.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
A
На сайте с 19.07.2010
Offline
130
#3
LEOnidUKG:
Может быть обходной вариант?
http://www.sql.ru/forum/430173/kolichestvo-vhozhdeniy-podstroki-v-stroku

Ещё предлагают использовать готовые функции:
http://myrusakov.ru/how-to-find-substring-in-string-sql.html

Первый вариант - жесть, даже проверять не стал, LIKE будет быстрее.

Второй вариант попробовал на мелкой табличке 40тыс записей, время выполнения:

LOCATE - 0,12 сек

LIKE - 0.08 сек

т.е. LIKE тоже быстрее

LEOnidUKG
На сайте с 25.11.2006
Offline
1722
#4
вроде бы простую проблему

Вообще, что делать... ну like юзать и ждать. Возможно кэш прикрутить руками, если нужно.

Короче надо искать в интернете. Возможно использовать NOSQL

---------- Добавлено 30.03.2015 в 12:32 ----------

Вообще ТС, распишите подробнее. Что там в этом столбце? Просто слово или предложение? Вы пытаетесь искать часть этого слова или целые слова?

Хелпзонович
На сайте с 15.06.2005
Offline
133
#5

sphinx


10 сфинксов

Вы там держитесь! Хорошего вам настроения. Здоровья.
M
На сайте с 04.08.2008
Offline
80
#6

Вообщем, спасибо всем за ответы. Проблему решил совсем другим способом. Написал десктопную программу: весь файл CSV загружается в память. И побайтно выполняется поиск (стандартные функции поиска подстроки не используются, так как скорость снижается на порядки). Скорость хорошая.

Правда есть проблемка. Я планировал считать в количество строк, в которых встречается подстрока. А программа считает тупо количество вхождений подстроки. То есть в одной записи/строке может быть несколько подстрок, их нужно подсчитать как одну. Но это детали.

Теперь по вопросам.

---------- Добавлено 30.03.2015 в 10:30 ----------

admak:
Как искали? Обычный grep пробовали?

Не-а, не пробовал. Но пробовал обычные функции поиска в прикладной программе: достаточно долго. Поэтому наверное тоже не то.

grep "SUBSTRING" file.csv


После первого вызова файл закешируется и последующие поиски будут быстрее. Ну или для надежности положить файл в рам (tmpfs).

Запросы практически всегда будут уникальными


LIKE - не использует индексы.

Да, для запросов типа LIKE %SUBSTRING% не используются. Поэтому и не подходит.


Как вариант, соэдать дополнительное текстовое поле(или varchar), которое будет содержать только "цифробуквенный символы и знак '-'" разделяемые пробелами, если их несколько. Именно по этому полю и делать полнотекстовый поиск.

Не пойдет. В строке ABSDSUBSTRINGEFG не будет найдет подстрока SUBSTRING, так как невозможно сделать запрос в полнотекстовом поиске типа *SUBSTRING*

---------- Добавлено 30.03.2015 в 10:35 ----------

LEOnidUKG:
Использует, но в таком формате как у ТС, не использует.

Может быть обходной вариант?
http://www.sql.ru/forum/430173/kolichestvo-vhozhdeniy-podstroki-v-stroku

Честно говоря не понял этот SQL-запрос. Хотя мне именно количество и нужно. Сколько времени будет считать, если несколько миллионов записей? Этот запрос может использовать индекс?


---------- Добавлено 30.03.2015 в 12:04 ----------

Ещё предлагают использовать готовые функции:
http://myrusakov.ru/how-to-find-substring-in-string-sql.html

---------- Добавлено 30.03.2015 в 12:05 ----------

И вообще ищите в гугле, там много всяких интересных решений.

Искал, но достаточно простого решения не нашел. Установка сфинксов и т.д. и т.п.

---------- Добавлено 30.03.2015 в 10:41 ----------

LEOnidUKG:
Вообще, что делать... ну like юзать и ждать. Возможно кэш прикрутить руками, если нужно.
Короче надо искать в интернете. Возможно использовать NOSQL

---------- Добавлено 30.03.2015 в 12:32 ----------

Вообще ТС, распишите подробнее. Что там в этом столбце? Просто слово или предложение? Вы пытаетесь искать часть этого слова или целые слова?

В поле доменные имена. Подстрока часть доменного имени. Вот )

А в целом, всем спасибо за ответы. Если с прикладной программкой не срастется, попробую один из предложенных вариантов выше.

A
На сайте с 19.07.2010
Offline
130
#7
Muhandis:
Не-а, не пробовал. Но пробовал обычные функции поиска в прикладной программе: достаточно долго. Поэтому наверное тоже не то.

а попробуйте, будете удивлены :)

если лень програмить, просто в консоле скажите

time grep "SUBSTRING" file.csv

на выходе будет результат + покажет время выполнения.

запустите пару раз, можно с разными строками поиска

M
На сайте с 04.08.2008
Offline
80
#8

Попробую, спасибо. Хотя все-таки нам проще юзать прикладную программу в Windows, web-сервер я решил использовать, только чтобы удобней было использовать MySQL. Лучше доработаю десктопную прогу. Еще раз всем спасибо :)

Оптимизайка
На сайте с 11.03.2012
Offline
396
#9
⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий