Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Помогите выбрать бд для поиска текста в большой бд  [new]
sekos
Guest
В данных момент есть поиск в бд LIKE "%something%". Тормозит на больших обьемах данных. Fulltext search и "something%" не предлагать плз. В данном случае всё написано на MySQL 4.0.

Другие БД могут справиться с этой задачей лучше?

Нужно искать именно n-ое кол-во букв в строке. Длина - 2..64 символа.

Может есть варианты что-то кардинально изменить, улучшив скорость?
24 май 06, 16:52    [2701772]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
MGR
Member

Откуда:
Сообщений: 536
"большие объемы" это сколько в строках/гигибайтах?
24 май 06, 17:12    [2701903]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
Yo.!!
Guest
sekos

Нужно искать именно n-ое кол-во букв в строке. Длина - 2..64 символа.


это значит fullscan всей таблицы, на любой субд. т.е. переход ничего не даст.

sekos
Может есть варианты что-то кардинально изменить, улучшив скорость?


рассказывай, что за задача, и будем тебе рассказывать почему тебе ненада n-ое кол-во букв в произвольной строке.
24 май 06, 17:16    [2701939]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
sekos
Guest
Есть строки типа

ez548-sek1
UZ53310SK20

БД с серийниками некого оборудования. Серийники могут быть любыми. Данных порядка 70 млн. Пользователь вводит запросв и надо что бы ему вывелось всё оборудование серийники которых содержат данный запрос. Запрос минимум 2 символа.

Вот такая вот задача.
24 май 06, 17:46    [2702160]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
ну я
Member

Откуда: Москва
Сообщений: 1276
sekos
В данных момент есть поиск в бд LIKE "%something%". Тормозит на больших обьемах данных. Fulltext search и "something%" не предлагать плз. В данном случае всё написано на MySQL 4.0.

Другие БД могут справиться с этой задачей лучше?

Нужно искать именно n-ое кол-во букв в строке. Длина - 2..64 символа.

Может есть варианты что-то кардинально изменить, улучшив скорость?

Индекс по этому полю таблицы есть?
24 май 06, 18:16    [2702327]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
VoDA
Member

Откуда: сеРверная пальмира :)
Сообщений: 4898
sekos
Есть строки типа

ez548-sek1
UZ53310SK20

БД с серийниками некого оборудования. Серийники могут быть любыми. Данных порядка 70 млн. Пользователь вводит запросв и надо что бы ему вывелось всё оборудование серийники которых содержат данный запрос. Запрос минимум 2 символа.

Вот такая вот задача.
Сделать собственный "полнотекстовый поиск".
Разделить серийник на элементы и искать среди этих элементов. поиск тогда будет по прямому соответствию, т.е. используется индекс.

Но нужна денормализация БД - это вызовет сильный рост объемов данных + алгоритм актуализации.
24 май 06, 18:17    [2702334]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32896

Привет, ну!
Ты пишешь:

ну
ня> Индекс по этому полю таблицы есть?
Кхм, мсье знает ТАКОЙ вид индексов?

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.3

24 май 06, 18:21    [2702354]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
ну я
Member

Откуда: Москва
Сообщений: 1276
Если не критично использование именно SQL, то можно на каше строить индексы какие заблагорассудится.
В двух словах - обычная схема - это два отображения
1) по иду получить строку таблицы
2) по значению (поле таблицы) получить ид строки

Можно второй пункт написать любым образом, например при записи UZ53310SK20
делать отображение
UZ53310SK20 -> id
Z53310SK20 -> id
53310SK20 -> id
и так далее.
тогда все запросы вида %some% сводятся к виду some%. Скажем если пришло "найти содержащие Z5" то по индексу берем те которые начинаются на Z5 и вперед.
24 май 06, 18:24    [2702367]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
ну я
Member

Откуда: Москва
Сообщений: 1276
Мимопроходящий

Привет, ну!
Ты пишешь:

ну
ня> Индекс по этому полю таблицы есть?
Кхм, мсье знает ТАКОЙ вид индексов?

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.3

А толку в моих знаниях? Пользоваться-то ему придется имеющимися серверами.
24 май 06, 18:26    [2702378]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
sekos
Guest
ну я

Индекс по этому полю таблицы есть?


Да

VoDa
Сделать собственный "полнотекстовый поиск".
Разделить серийник на элементы и искать среди этих элементов. поиск тогда будет по прямому соответствию, т.е. используется индекс.


Дело в том что серийники абсолютно разные, разных видов и т.д. как таковой фикс.структуры у них нет.
24 май 06, 18:32    [2702409]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
VoDA
Member

Откуда: сеРверная пальмира :)
Сообщений: 4898
sekos
Дело в том что серийники абсолютно разные, разных видов и т.д. как таковой фикс.структуры у них нет.
По условиям задачи поиск минимум по 2-м символам.
Берем UZ53310SK20
и превращаем в набор:
UZ
Z5
53
33
31
10
0S
SK
K2
20
Это - поиск по 2-м символам.

Аналогично по 3-м и более:
UZ5
Z53
533
и т.п.

Дальше строится индекс по этому полю. и ищется по ПОЛНОМУ совпадению, что быстрее LIKE "%something%"
минусы я описал выше.
24 май 06, 18:41    [2702446]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
sekos
Guest
VoDA
sekos
Дело в том что серийники абсолютно разные, разных видов и т.д. как таковой фикс.структуры у них нет.
По условиям задачи поиск минимум по 2-м символам.
Берем UZ53310SK20
и превращаем в набор:
UZ
Z5
53
33
31
10
0S
SK
K2
20
Это - поиск по 2-м символам.

Аналогично по 3-м и более:
UZ5
Z53
533
и т.п.

Дальше строится индекс по этому полю. и ищется по ПОЛНОМУ совпадению, что быстрее LIKE "%something%"
минусы я описал выше.


Не совсем понял, получается 64 таблицы (длина 2..64) дублирующие данные много раз из основной таблицы?
Какие конкретно минусы?
24 май 06, 18:48    [2702473]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
Syleiman
Member

Откуда:
Сообщений: 41
А быть может подключить систему полнотекстового поиска. Мы используем DTSearch
24 май 06, 19:03    [2702557]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
sekos
Guest
Полнотекстовый не подходит
24 май 06, 19:41    [2702712]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
Rus000
Member

Откуда: Красноярск
Сообщений: 317
народ правильно предлагает насчет построения доп структуры - по другому никак. Либо выигрываешь в скорости и полный перебор с поиском подстроки, либо строй индекс и имей денормализованную схему со всеми вытекающими
24 май 06, 21:08    [2702908]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
Yo.!!
Guest
чо-то не пойму, откуда у юзера кусок серийника ? это чо варезный сайт с порнухой ?
24 май 06, 21:10    [2702911]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
Sergei Obrastsov
Member

Откуда: Магадан
Сообщений: 584
sekos
Есть строки типа

ez548-sek1
UZ53310SK20

БД с серийниками некого оборудования. Серийники могут быть любыми. Данных порядка 70 млн. Пользователь вводит запросв и надо что бы ему вывелось всё оборудование серийники которых содержат данный запрос. Запрос минимум 2 символа.

Вот такая вот задача.

ну вот, скажем, решение для M-системы:

^table(idx)=серийник

^index(pos,smb,idx)=

pos - позиция символа в серийнике
smb - символ
idx - индекс, под которым записан серийник в массиве ^table

алгоритм поиска:
       set smb=$extract(Query) ;берем первый символ
       for q=1:1:65-$length(Query) do  ;
       . set idx="" for  set idx=$order(^index(q,smb,idx)) quit:idx=""  do  ;
       .. set cnt=0
       .. for t=2:1:$length(Query) s smb2=$extract(Query,t) if $data(^index(q+t-1,smb2,idx)) set cnt=cnt+1
       .. if cnt'=($length(Query)-1) quit
       .. write !,^table(idx)
последовательно перемещаем первый символ запроса по позициям 1-(65-длина запроса), выбирая все соответствующие этому индексы.
далее в цикле до конца запроса проверяем наличие этого индекса под следующим символом запроса в позиции следующей за проверяемой.
совпадение всех условий дает нам нужный индекс

несколько громоздко, зато достаточно эффективно
для 70 млн. записей по 64 байта все это удовольствие займет ~60Gb

С уважением. Сергей
25 май 06, 01:25    [2703355]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
Sergei Obrastsov
Member

Откуда: Магадан
Сообщений: 584
Sergei Obrastsov
несколько громоздко, зато достаточно эффективно
для 70 млн. записей по 64 байта все это удовольствие займет ~60Gb

прикинул на переменных длинах серийников (4-64), получается 11.5Gb
не так уж и страшно

С уважением. Сергей
25 май 06, 04:12    [2703416]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
ну я
А толку в моих знаниях? Пользоваться-то ему придется имеющимися серверами.


Мусье известно о доменных индексах ?
Но предлагаемый вами индекс получится гмм ... большим
Скорее всего, больше самой таблицы, и не факт что по нему будет искать быстрее
25 май 06, 09:05    [2703586]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
tygra
Member

Откуда: Тверь (Иркутск, Край)
Сообщений: 9997
sekos
Не совсем понял, получается 64 таблицы (длина 2..64) дублирующие данные много раз из основной таблицы?
Какие конкретно минусы?

Одна таблица получается.
Такая:
ИД товара, Кусок серийника

Каждый серийник разбиваете на куски. Тут два варианта:
1. Бьете серийник на куски по 2-3-4-... букв во всех сочетаниях. ИМХО это бесмысленно
2. Бьете серийник на куски так - каждый кусок наччинается со сследующей буквы: 123456-23456-3456-456-56

Ищите по нему like '123%', будет быстро.

Единственный минус - объем этой таблицы будет раза в 2-3 больше объема серийников. Но это не страшно.

-- Tygra's --
25 май 06, 10:33    [2703986]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
ну я
Member

Откуда: Москва
Сообщений: 1276
Gluk (Kazan)
ну я
А толку в моих знаниях? Пользоваться-то ему придется имеющимися серверами.

Мусье известно о доменных индексах ?

Может быть под другим именем?

Gluk (Kazan)
Но предлагаемый вами индекс получится гмм ... большим
Скорее всего, больше самой таблицы, и не факт что по нему будет искать быстрее

Увы, да, большой.
А что поиск быстрее - это факт. Проверено на нескольких приложениях.
25 май 06, 10:46    [2704074]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
ну я
Gluk (Kazan)
ну я
А толку в моих знаниях? Пользоваться-то ему придется имеющимися серверами.

Мусье известно о доменных индексах ?

Может быть под другим именем?


Эта такая фича Oracle, которая позволяет писать свои индексы.
Например по отпечаткам пальцев или для картографии
Или для контекстного поиска
25 май 06, 10:58    [2704157]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
alex_k
Member

Откуда: krasnoyarsk
Сообщений: 6694
если он введет два символа то база ему выдасть пару другую тысяч серийников из 70 миллионов.
Оно ему надо?

нужно конкретизировать условие и уже в ограниченном наборе строк делать условие like
по моему так...
25 май 06, 11:09    [2704231]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
ну я
Member

Откуда: Москва
Сообщений: 1276
Gluk (Kazan)
Мусье известно о доменных индексах ?

Эта такая фича Oracle, которая позволяет писать свои индексы.
Например по отпечаткам пальцев или для картографии
Или для контекстного поиска

Растут, однако!
25 май 06, 11:18    [2704317]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать бд для поиска текста в большой бд  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
Gluk (Kazan)
ну я
Gluk (Kazan)
ну я
А толку в моих знаниях? Пользоваться-то ему придется имеющимися серверами.

Мусье известно о доменных индексах ?

Может быть под другим именем?


Эта такая фича Oracle, которая позволяет писать свои индексы.
Например по отпечаткам пальцев или для картографии
Или для контекстного поиска


В DB2 это называется INDEX EXTENSION и известно с 5 версии... сейчас уже 9 версия...
25 май 06, 12:05    [2704642]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить