- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу

Маркетинг для шоколадной фабрики. На 34% выше средний чек
Через устранение узких мест
Оксана Мамчуева

VK приобрела 70% в структуре компании-разработчика red_mad_robot
Которая участвовала в создании RuStore
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Передо мной встала проблема: быстрый поиск подстроки в базе. На первый взгляд показалост все просто. Итак...
Исходник: CSV файл с более чем 4,5 млн записей. Само собой без индекса поиск происходит очень медленно: в течении около 5-7 секунд. Так как нужно обрабатывать несколько сотен тысяч запросов это непозволительно долго на один запрос.Встал вопрос перевода в базу данных с индексами.
Первое, что пришло в голову: MySQL. Итак, перевел таблицу в дамп .SQL и залил на сервер.
Но запросы типа
оказались еще медленней (10-25 секунд): такие запросы не могут использовать индексы (?!).Следующая идея: использовать полнотекстовый поиск. (подстрока может содержать только цифробуквенный символы и знак '-', поэтому для FULLTEXT, казалось, самое то) Создал FULLTEXT индекс. И вот уже казалось победа близка. Планировал делать запросы в MySQL:
. Поиск происходит сотые доли секунды! НО... как оказалось шаблон *SUBSTRING* в полнотекстовом поиске использовать нельзя! Можно только так: SUBSTRING* (то есть ищет любое слово начинающееся с SUBSTRING.).Итак, вопрос к спецам MySQL: что можно сделать? Можно ли? Какие еще несложные манипуляции с базой можно проделать, чтобы решить такую вроде бы простую проблему: быстрый поиск подстроки в базе.
Заранее благодарю за любые советы и подсказки
Исходник: CSV файл с более чем 4,5 млн записей. Само собой без индекса поиск происходит очень медленно: в течении около 5-7 секунд.
Как искали? Обычный grep пробовали?
После первого вызова файл закешируется и последующие поиски будут быстрее. Ну или для надежности положить файл в рам (tmpfs).
LIKE - не использует индексы.
подстрока может содержать только цифробуквенный символы и знак '-', поэтому для FULLTEXT, казалось, самое то
Как вариант, соэдать дополнительное текстовое поле(или varchar), которое будет содержать только "цифробуквенный символы и знак '-'" разделяемые пробелами, если их несколько. Именно по этому полю и делать полнотекстовый поиск.
Использует, но в таком формате как у ТС, не использует.
Может быть обходной вариант?
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 ----------
И вообще ищите в гугле, там много всяких интересных решений.
Может быть обходной вариант?
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 тоже быстрее
Вообще, что делать... ну like юзать и ждать. Возможно кэш прикрутить руками, если нужно.
Короче надо искать в интернете. Возможно использовать NOSQL
---------- Добавлено 30.03.2015 в 12:32 ----------
Вообще ТС, распишите подробнее. Что там в этом столбце? Просто слово или предложение? Вы пытаетесь искать часть этого слова или целые слова?
sphinx
10 сфинксов
Вообщем, спасибо всем за ответы. Проблему решил совсем другим способом. Написал десктопную программу: весь файл CSV загружается в память. И побайтно выполняется поиск (стандартные функции поиска подстроки не используются, так как скорость снижается на порядки). Скорость хорошая.
Правда есть проблемка. Я планировал считать в количество строк, в которых встречается подстрока. А программа считает тупо количество вхождений подстроки. То есть в одной записи/строке может быть несколько подстрок, их нужно подсчитать как одну. Но это детали.
Теперь по вопросам.
---------- Добавлено 30.03.2015 в 10:30 ----------
Как искали? Обычный grep пробовали?
Не-а, не пробовал. Но пробовал обычные функции поиска в прикладной программе: достаточно долго. Поэтому наверное тоже не то.
После первого вызова файл закешируется и последующие поиски будут быстрее. Ну или для надежности положить файл в рам (tmpfs).
Запросы практически всегда будут уникальными
LIKE - не использует индексы.
Да, для запросов типа LIKE %SUBSTRING% не используются. Поэтому и не подходит.
Как вариант, соэдать дополнительное текстовое поле(или varchar), которое будет содержать только "цифробуквенный символы и знак '-'" разделяемые пробелами, если их несколько. Именно по этому полю и делать полнотекстовый поиск.
Не пойдет. В строке ABSDSUBSTRINGEFG не будет найдет подстрока SUBSTRING, так как невозможно сделать запрос в полнотекстовом поиске типа *SUBSTRING*
---------- Добавлено 30.03.2015 в 10:35 ----------
Использует, но в таком формате как у ТС, не использует.
Может быть обходной вариант?
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 ----------
Вообще, что делать... ну like юзать и ждать. Возможно кэш прикрутить руками, если нужно.
Короче надо искать в интернете. Возможно использовать NOSQL
---------- Добавлено 30.03.2015 в 12:32 ----------
Вообще ТС, распишите подробнее. Что там в этом столбце? Просто слово или предложение? Вы пытаетесь искать часть этого слова или целые слова?
В поле доменные имена. Подстрока часть доменного имени. Вот )
А в целом, всем спасибо за ответы. Если с прикладной программкой не срастется, попробую один из предложенных вариантов выше.
Не-а, не пробовал. Но пробовал обычные функции поиска в прикладной программе: достаточно долго. Поэтому наверное тоже не то.
а попробуйте, будете удивлены :)
если лень програмить, просто в консоле скажите
на выходе будет результат + покажет время выполнения.
запустите пару раз, можно с разными строками поиска
Попробую, спасибо. Хотя все-таки нам проще юзать прикладную программу в Windows, web-сервер я решил использовать, только чтобы удобней было использовать MySQL. Лучше доработаю десктопную прогу. Еще раз всем спасибо :)
http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html