powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Помогите выбрать бд для поиска текста в большой бд
44 сообщений из 44, показаны все 2 страниц
Помогите выбрать бд для поиска текста в большой бд
    #33749237
sekos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В данных момент есть поиск в бд LIKE "%something%". Тормозит на больших обьемах данных. Fulltext search и "something%" не предлагать плз. В данном случае всё написано на MySQL 4.0.

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

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

Может есть варианты что-то кардинально изменить, улучшив скорость?
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33749307
MGR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"большие объемы" это сколько в строках/гигибайтах?
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33749332
Yo.!!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sekos
Нужно искать именно n-ое кол-во букв в строке. Длина - 2..64 символа.


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

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

рассказывай, что за задача, и будем тебе рассказывать почему тебе ненада n-ое кол-во букв в произвольной строке.
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33749447
sekos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть строки типа

ez548-sek1
UZ53310SK20

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

Вот такая вот задача.
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33749551
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sekosВ данных момент есть поиск в бд LIKE "%something%". Тормозит на больших обьемах данных. Fulltext search и "something%" не предлагать плз. В данном случае всё написано на MySQL 4.0.

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

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

Может есть варианты что-то кардинально изменить, улучшив скорость?
Индекс по этому полю таблицы есть?
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33749556
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sekosЕсть строки типа

ez548-sek1
UZ53310SK20

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

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

Но нужна денормализация БД - это вызовет сильный рост объемов данных + алгоритм актуализации.
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33749573
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, ну!
Ты пишешь:

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

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

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33749580
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не критично использование именно SQL, то можно на каше строить индексы какие заблагорассудится.
В двух словах - обычная схема - это два отображения
1) по иду получить строку таблицы
2) по значению (поле таблицы) получить ид строки

Можно второй пункт написать любым образом, например при записи UZ53310SK20
делать отображение
UZ53310SK20 -> id
Z53310SK20 -> id
53310SK20 -> id
и так далее.
тогда все запросы вида %some% сводятся к виду some%. Скажем если пришло "найти содержащие Z5" то по индексу берем те которые начинаются на Z5 и вперед.
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33749589
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
Привет, ну!
Ты пишешь:

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

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

Posted via ActualForum NNTP Server 1.3
А толку в моих знаниях? Пользоваться-то ему придется имеющимися серверами.
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33749608
sekos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну я
Индекс по этому полю таблицы есть?

Да

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

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

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

Дальше строится индекс по этому полю. и ищется по ПОЛНОМУ совпадению, что быстрее LIKE "%something%"
минусы я описал выше.
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33749650
sekos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VoDA sekosДело в том что серийники абсолютно разные, разных видов и т.д. как таковой фикс.структуры у них нет.По условиям задачи поиск минимум по 2-м символам.
Берем UZ53310SK20
и превращаем в набор:
UZ
Z5
53
33
31
10
0S
SK
K2
20
Это - поиск по 2-м символам.

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

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

Не совсем понял, получается 64 таблицы (длина 2..64) дублирующие данные много раз из основной таблицы?
Какие конкретно минусы?
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33749684
Syleiman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А быть может подключить систему полнотекстового поиска. Мы используем DTSearch
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33749756
sekos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Полнотекстовый не подходит
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33749842
Rus000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
народ правильно предлагает насчет построения доп структуры - по другому никак. Либо выигрываешь в скорости и полный перебор с поиском подстроки, либо строй индекс и имей денормализованную схему со всеми вытекающими
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33749845
Yo.!!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чо-то не пойму, откуда у юзера кусок серийника ? это чо варезный сайт с порнухой ?
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33750040
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sekosЕсть строки типа

ez548-sek1
UZ53310SK20

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

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

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

^index(pos,smb,idx)=

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

алгоритм поиска:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
       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

С уважением. Сергей
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33750070
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergei Obrastsovнесколько громоздко, зато достаточно эффективно
для 70 млн. записей по 64 байта все это удовольствие займет ~60Gb

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

С уважением. Сергей
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33750216
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну яА толку в моих знаниях? Пользоваться-то ему придется имеющимися серверами.

Мусье известно о доменных индексах ?
Но предлагаемый вами индекс получится гмм ... большим
Скорее всего, больше самой таблицы, и не факт что по нему будет искать быстрее
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33750477
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sekosНе совсем понял, получается 64 таблицы (длина 2..64) дублирующие данные много раз из основной таблицы?
Какие конкретно минусы?
Одна таблица получается.
Такая:
ИД товара, Кусок серийника

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

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

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

-- Tygra's --
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33750532
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan) ну яА толку в моих знаниях? Пользоваться-то ему придется имеющимися серверами.
Мусье известно о доменных индексах ?
Может быть под другим именем?

Gluk (Kazan)Но предлагаемый вами индекс получится гмм ... большим
Скорее всего, больше самой таблицы, и не факт что по нему будет искать быстрее
Увы, да, большой.
А что поиск быстрее - это факт. Проверено на нескольких приложениях.
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33750586
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я Gluk (Kazan) ну яА толку в моих знаниях? Пользоваться-то ему придется имеющимися серверами.
Мусье известно о доменных индексах ?
Может быть под другим именем?


Эта такая фича Oracle, которая позволяет писать свои индексы.
Например по отпечаткам пальцев или для картографии
Или для контекстного поиска
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33750629
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если он введет два символа то база ему выдасть пару другую тысяч серийников из 70 миллионов.
Оно ему надо?

нужно конкретизировать условие и уже в ограниченном наборе строк делать условие like
по моему так...
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33750676
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)Мусье известно о доменных индексах ?

Эта такая фича Oracle, которая позволяет писать свои индексы.
Например по отпечаткам пальцев или для картографии
Или для контекстного поиска
Растут, однако!
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33750889
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan) ну я Gluk (Kazan) ну яА толку в моих знаниях? Пользоваться-то ему придется имеющимися серверами.
Мусье известно о доменных индексах ?
Может быть под другим именем?


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

В DB2 это называется INDEX EXTENSION и известно с 5 версии... сейчас уже 9 версия...
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33750899
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точно, растут. В 8 версии появилось если не раньше
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33751119
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sekosНе совсем понял, получается 64 таблицы (длина 2..64) дублирующие данные много раз из основной таблицы?
Какие конкретно минусы?Действительно не поняли.

Нужна еще одна таблица-справочник для индекса,в которую гонятся все возможные поисковые варианты. + талбица связей из каких серийников получено данное поисковое выражение.
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33752878
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sekosВ данных момент есть поиск в бд LIKE "%something%". Тормозит на больших обьемах данных. Fulltext search и "something%" не предлагать плз. В данном случае всё написано на MySQL 4.0.

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

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

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

Подумайте все-таки о Fulltext search. Если сработает, то это ИМХО самое простое решение, вообще ничего делать не нужно.

Идея в том, чтобы заставить сервер думать что каждая буква это слово, например можно определить дополнительную таблицу с серийными номерами, но буквы разделены пробелами. Тогда найти LIKE "%something%" эквивалентно нахождению последовательности слов "s o m e t h i n g", что есть стандартная задача для полнотескстового поиска. Не знаю как это реализовано в МуСКЛ, но вроде должно быть быстрее чем LIKE "%something%".
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33752913
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или решение аналогичное тому, которое предлагал Sergei Obrastsov, но для СКЛ сервера (sybase ASA). Пример переделан из работающего более сложного путем выбрасывания лишнего, поэтому запрос по-видимому можно еще упростить/соптимизировать.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
//таблица серийных номеров
create table sn(           	//серийные номера
  ,id unsigned int not primary key default autoincrement
  ,sn varchar not null
  );

//служебная таблица
create table snc(           	//символы в серийных номерах
  ,sn unsigned int not null references sn(id)               //id серийного номера
  ,n  tinyint                        //порядковый номер символа в серийном номере, счет начинается с  0 , интервал  0 .. 255 
  ,ch char( 1 )
  ,primary key (sn,n,ch)
  );

/*
часть серийного номера, по которой идет поиск;
таблица заполняется перед запросом, поскольку таблица "local temporary", то пользователи мешать друг другу не будут;
для поиска "-se" в "ez548-sek1" будет: 
{(0,'-')
,(1,'s')
,(2,'e')}
*/
declare local temporary table #w ( 
  ,nw int              //номер символа в строке, счет начинается с  0 
  ,ch char( 1 ))      //символ
  not transactional;

//запрос всегда один и тот же
select min(s.sn) //min не используется, нужен только из-за group by
   from sn s
     ,(select v.sn id,t1.ch ch,v.n+t1.n n,v.n n0
         from snс v, #w t, #w t1
         where t.n= 0  and v.ch=t.ch) t
  where s.id=t.id and s.n=t.n and s.ch=t.ch 
  group by s.id, t.n0
  having count(*) = (select count(*) from #w);

Не знаю как МуСКЛ справится с таким запросом, у сайбейз АСА проблем не замечено.
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33752926
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c127
Не знаю как МуСКЛ справится с таким запросом, у сайбейз АСА проблем не замечено.
как с размерами? и скорость, конечно, тоже интересует
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33753309
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergei Obrastsov c127
Не знаю как МуСКЛ справится с таким запросом, у сайбейз АСА проблем не замечено.
как с размерами? и скорость, конечно, тоже интересует
С размерами все в порядке, не беспокоят никак. А скорость и самого интересует, но пока удовлетворительная.

Ну а если серьезно, то я даже синтаксис не проверял, честно же написал, что выдрал кусок из более сложной задачи и слегка подправил. Там еще есть различные поля, в которых нужно искать, поиск на включение-исключение, группы пользователей и права доступа к ресурсам, по которым идет поиск, а поиск идет не по символам а по словам. Запрос в принципе такой же, есть еще пара соединений с представлениями. Так что цифры я назвать могу, но результат Вам ничего не скажет.

Кстати о скорости. Вы не ответили, с какой скоростью создает индекс МуСКЛ и КЕШ в Вашем тесте?
http://sql.ru/forum/actualthread.aspx?tid=293038&pg=11#2698636
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33753775
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c127Или решение аналогичное тому, которое предлагал Sergei Obrastsov, но для СКЛ сервера (sybase ASA). Пример переделан из работающего более сложного путем выбрасывания лишнего, поэтому запрос по-видимому можно еще упростить/соптимизировать.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
//таблица серийных номеров
create table sn(           	//серийные номера
  ,id unsigned int not primary key default autoincrement
  ,sn varchar not null
  );

//служебная таблица
create table snc(           	//символы в серийных номерах
  ,sn unsigned int not null references sn(id)               //id серийного номера
  ,n  tinyint                        //порядковый номер символа в серийном номере, счет начинается с  0 , интервал  0 .. 255 
  ,ch char( 1 )
  ,primary key (sn,n,ch)
  );

/*
часть серийного номера, по которой идет поиск;
таблица заполняется перед запросом, поскольку таблица "local temporary", то пользователи мешать друг другу не будут;
для поиска "-se" в "ez548-sek1" будет: 
{(0,'-')
,(1,'s')
,(2,'e')}
*/
declare local temporary table #w ( 
  ,nw int              //номер символа в строке, счет начинается с  0 
  ,ch char( 1 ))      //символ
  not transactional;

//запрос всегда один и тот же
select min(s.sn) //min не используется, нужен только из-за group by
   from sn s
     ,(select v.sn id,t1.ch ch,v.n+t1.n n,v.n n0
         from snс v, #w t, #w t1
         where t.n= 0  and v.ch=t.ch) t
  where s.id=t.id and s.n=t.n and s.ch=t.ch 
  group by s.id, t.n0
  having count(*) = (select count(*) from #w);

Не знаю как МуСКЛ справится с таким запросом, у сайбейз АСА проблем не замечено.group by - обычно тыжеловат.
да и - having count(*) = (select count(*) from #w); ИМХО тоже дает нагрузку на систему.
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33753782
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наверное быстрее будет так:

CREATE TABLE [dbo].[Connect] (
[Connect_ID] [int] IDENTITY (1, 1) NOT NULL ,
[ID] [int] NOT NULL ,
[text_id] [int] NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[serial] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[Serial] [varchar] (80) COLLATE Cyrillic_General_CI_AS NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[text_search] (
[Text_id] [int] IDENTITY (1, 1) NOT NULL ,
[Text_part] [varchar] (80) COLLATE Cyrillic_General_CI_AS NOT NULL
) ON [PRIMARY]
GO

CREATE INDEX [IX_Connect] ON [dbo].[Connect]([ID]) ON [PRIMARY]
GO

CREATE INDEX [IX_Connect_1] ON [dbo].[Connect]([text_id]) ON [PRIMARY]
GO

CREATE INDEX [IX_text_search] ON [dbo].[text_search]([Text_part]) ON [PRIMARY]
GO

создаем таблицы
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33753798
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[dbo].[serial] - таблица значений
[dbo].[Connect] - показывает что их словаря какому серийнику соответствует
[dbo].[text_search] - таблица- СЛОВАРЬ серийных комбинаций

заполняем:
insert into serial (serial) values ('texting')
insert into serial (serial) values ('ez548-sek1')

только для ez548-sek1 (лениво делать для других, принцип и так понятен)

INSERT INTO text_search (Text_part) VALUES ('ez')
INSERT INTO [Connect] (ID, text_id) VALUES (2,46)
INSERT INTO text_search (Text_part) VALUES ('z5')
INSERT INTO [Connect] (ID, text_id) VALUES (2,47)
INSERT INTO text_search (Text_part) VALUES ('54')
INSERT INTO [Connect] (ID, text_id) VALUES (2,48)
INSERT INTO text_search (Text_part) VALUES ('48')
INSERT INTO [Connect] (ID, text_id) VALUES (2,49)
INSERT INTO text_search (Text_part) VALUES ('8-')
INSERT INTO [Connect] (ID, text_id) VALUES (2,50)
INSERT INTO text_search (Text_part) VALUES ('-s')
INSERT INTO [Connect] (ID, text_id) VALUES (2,51)
INSERT INTO text_search (Text_part) VALUES ('se')
INSERT INTO [Connect] (ID, text_id) VALUES (2,52)
INSERT INTO text_search (Text_part) VALUES ('ek')
INSERT INTO [Connect] (ID, text_id) VALUES (2,53)
INSERT INTO text_search (Text_part) VALUES ('k1')
INSERT INTO [Connect] (ID, text_id) VALUES (2,54)
INSERT INTO text_search (Text_part) VALUES ('ez5')
INSERT INTO [Connect] (ID, text_id) VALUES (2,55)
INSERT INTO text_search (Text_part) VALUES ('z54')
INSERT INTO [Connect] (ID, text_id) VALUES (2,56)
INSERT INTO text_search (Text_part) VALUES ('548')
INSERT INTO [Connect] (ID, text_id) VALUES (2,57)
INSERT INTO text_search (Text_part) VALUES ('48-')
INSERT INTO [Connect] (ID, text_id) VALUES (2,58)
INSERT INTO text_search (Text_part) VALUES ('8-s')
INSERT INTO [Connect] (ID, text_id) VALUES (2,59)
INSERT INTO text_search (Text_part) VALUES ('-se')
INSERT INTO [Connect] (ID, text_id) VALUES (2,60)
INSERT INTO text_search (Text_part) VALUES ('sek')
INSERT INTO [Connect] (ID, text_id) VALUES (2,61)
INSERT INTO text_search (Text_part) VALUES ('ek1')
INSERT INTO [Connect] (ID, text_id) VALUES (2,62)
INSERT INTO text_search (Text_part) VALUES ('ez54')
INSERT INTO [Connect] (ID, text_id) VALUES (2,63)
INSERT INTO text_search (Text_part) VALUES ('z548')
INSERT INTO [Connect] (ID, text_id) VALUES (2,64)
INSERT INTO text_search (Text_part) VALUES ('548-')
INSERT INTO [Connect] (ID, text_id) VALUES (2,65)
INSERT INTO text_search (Text_part) VALUES ('48-s')
INSERT INTO [Connect] (ID, text_id) VALUES (2,66)
INSERT INTO text_search (Text_part) VALUES ('8-se')
INSERT INTO [Connect] (ID, text_id) VALUES (2,67)
INSERT INTO text_search (Text_part) VALUES ('-sek')
INSERT INTO [Connect] (ID, text_id) VALUES (2,68)
INSERT INTO text_search (Text_part) VALUES ('sek1')
INSERT INTO [Connect] (ID, text_id) VALUES (2,69)
INSERT INTO text_search (Text_part) VALUES ('ez548')
INSERT INTO [Connect] (ID, text_id) VALUES (2,70)
INSERT INTO text_search (Text_part) VALUES ('z548-')
INSERT INTO [Connect] (ID, text_id) VALUES (2,71)
INSERT INTO text_search (Text_part) VALUES ('548-s')
INSERT INTO [Connect] (ID, text_id) VALUES (2,72)
INSERT INTO text_search (Text_part) VALUES ('48-se')
INSERT INTO [Connect] (ID, text_id) VALUES (2,73)
INSERT INTO text_search (Text_part) VALUES ('8-sek')
INSERT INTO [Connect] (ID, text_id) VALUES (2,74)
INSERT INTO text_search (Text_part) VALUES ('-sek1')
INSERT INTO [Connect] (ID, text_id) VALUES (2,75)
INSERT INTO text_search (Text_part) VALUES ('ez548-')
INSERT INTO [Connect] (ID, text_id) VALUES (2,76)
INSERT INTO text_search (Text_part) VALUES ('z548-s')
INSERT INTO [Connect] (ID, text_id) VALUES (2,77)
INSERT INTO text_search (Text_part) VALUES ('548-se')
INSERT INTO [Connect] (ID, text_id) VALUES (2,78)
INSERT INTO text_search (Text_part) VALUES ('48-sek')
INSERT INTO [Connect] (ID, text_id) VALUES (2,79)
INSERT INTO text_search (Text_part) VALUES ('8-sek1')
INSERT INTO [Connect] (ID, text_id) VALUES (2,80)
INSERT INTO text_search (Text_part) VALUES ('ez548-s')
INSERT INTO [Connect] (ID, text_id) VALUES (2,81)
INSERT INTO text_search (Text_part) VALUES ('z548-se')
INSERT INTO [Connect] (ID, text_id) VALUES (2,82)
INSERT INTO text_search (Text_part) VALUES ('548-sek')
INSERT INTO [Connect] (ID, text_id) VALUES (2,83)
INSERT INTO text_search (Text_part) VALUES ('48-sek1')
INSERT INTO [Connect] (ID, text_id) VALUES (2,84)
INSERT INTO text_search (Text_part) VALUES ('ez548-se')
INSERT INTO [Connect] (ID, text_id) VALUES (2,85)
INSERT INTO text_search (Text_part) VALUES ('z548-sek')
INSERT INTO [Connect] (ID, text_id) VALUES (2,86)
INSERT INTO text_search (Text_part) VALUES ('548-sek1')
INSERT INTO [Connect] (ID, text_id) VALUES (2,87)
INSERT INTO text_search (Text_part) VALUES ('ez548-sek')
INSERT INTO [Connect] (ID, text_id) VALUES (2,88)
INSERT INTO text_search (Text_part) VALUES ('z548-sek1')
INSERT INTO [Connect] (ID, text_id) VALUES (2,89)
INSERT INTO text_search (Text_part) VALUES ('ez548-sek1')
INSERT INTO [Connect] (ID, text_id) VALUES (2,90)
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33753807
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поиск:

select s.id
from serial s
join connect c on s.id = c.id
join text_search t on t.text_id = c.text_id
where text_part = 'sek1'

= - самое главное для чего вся возня и была. т.е. не идет сканов и сравнений по like. просто прямая выборка по индексу.
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33753818
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проблемы с размером text_search быть не должно, если делать её уникальным словарем данных.
Хотя объем будет больше чем у исходных данных. Ну так его мы и меняем на скорость.
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33755547
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VoDA sekosНе совсем понял, получается 64 таблицы (длина 2..64) дублирующие данные много раз из основной таблицы?
Какие конкретно минусы?Действительно не поняли.

Нужна еще одна таблица-справочник для индекса,в которую гонятся все возможные поисковые варианты. + талбица связей из каких серийников получено данное поисковое выражение.

если вы внимательно прочитаете условие, то заметите фразу "Fulltext search и "something%" не предлагать плз". То, что вы предлагаете, и есть "something%". Попробуйте прикинуть количество строк в вашей таблице, если искомая строка начинается не с первой позиции.
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33755730
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VoDAgroup by - обычно тыжеловат.
да и - having count(*) = (select count(*) from #w); ИМХО тоже дает нагрузку на систему.
Так все дает нагрузку на систему. Я когда-то сравнивал на эквивалентных запросах count(*) в подзапросе с group by, последний оказался в 2 раза быстрее, с тех пор стараюсь использовать его.

Если есть идеи как этот запрос можно упростить/соптимизировать, то будет очень интересно обсудить.

Кстати если бы запросы были вида like "something%", то проблем бы не было, сервер использовал бы индекс.
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33769343
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выбегаллоесли вы внимательно прочитаете условие, то заметите фразу "Fulltext search и "something%" не предлагать плз". То, что вы предлагаете, и есть "something%". Попробуйте прикинуть количество строк в вашей таблице, если искомая строка начинается не с первой позиции.
Читаем внимательно:
sekosВ данных момент есть поиск в бд LIKE "%something%". Тормозит на больших обьемах данных. Fulltext search и "something%" не предлагать плз. В данном случае всё написано на MySQL 4.0.

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

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

Может есть варианты что-то кардинально изменить, улучшив скорость?
Мое предложение это НЕ использует Fulltext search и НЕ использует выражения "something%" .

PS предложения?
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33770237
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сколько потребуется insert-ов для 64-байтного идентификатора ?
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33772717
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВыбегаллоСколько потребуется insert-ов для 64-байтного идентификатора ?Отвечаю: много, но основной вопрос не как съэкономить место, а Может есть варианты что-то кардинально изменить, улучшив скорость? .

Если есть вариант лучше - предложите!
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33776418
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VoDA ВыбегаллоСколько потребуется insert-ов для 64-байтного идентификатора ?Отвечаю: много, но основной вопрос не как съэкономить место, а Может есть варианты что-то кардинально изменить, улучшив скорость? .

Если есть вариант лучше - предложите!
Hint: 64! -- число о восьмидесяти девяти знаках.
Так будем место экономить, или так сойдёт?
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33776739
MGR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DocAl
Hint: 64! -- число о восьмидесяти девяти знаках.
Так будем место экономить, или так сойдёт?

Извините, что встреваю, но прочитав условие я не понял, причем тут 64! ???
У меня получается 2016 "кусочков" в случае если длина серийника 64.
Это конечно дофига, учитывая, что 70млн серийников. То есть в худшем случае имеем 150 миллиардов частей серийников длиной от 2х до 64
Но:
1. Не все серийники имеют длину в 64, я так надеюсь. И для скажем 20ти значного серийника получаем уже 190 "кусочков", что уже терпимо.
2. Можно ограничить длину поиска - в задаче конечно задано 64 верхняя граница, но это окнечно нонсенс. Имхо человек обычно ищет 5-10 символов, реже - 10-15. Так что скажем ограничение в 20 видится мне вполне разумным, а так мы получаем при длине серийника 64 символа всего (или "всего"?) 1026 "кусочков", то есть сократили почти в два раза.
...
Рейтинг: 0 / 0
Помогите выбрать бд для поиска текста в большой бд
    #33776866
MGR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, я вот прикинул.
Дано:
дополнительная табличка:
Код: plaintext
create table parts (source_id int, part varchar( 64 ) )

Где source_id - FK на родительскую табличку с серийниками

Для серийника длиной 64 символа - создаём 2016 строк в таблице parts, общий размер данных - 53 КБ.

Для серийника длиной 20 символов - создаём 190 строк в в таблице parts, общий размер данных - 2 КБ.

Для серийника длиной 10 символов - создаём 45 строк в в таблице parts, общий размер данных - 390 Б.

И плюс размер индекса.

Ну а не зная среднего размера серийника ничего сказать нельзя.
Если все серийники по 64 символа - жопа получится. 70млн на 53КБ ~= 4 ТБ, 140 миллиардов строк. Но если же в основном они по 20 символов - всего-то ~ 140 ГБ, 14 миллиардов строк.
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Помогите выбрать бд для поиска текста в большой бд
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]