powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Помогите выбрать бд для поиска текста в большой бд
19 сообщений из 44, страница 2 из 2
Помогите выбрать бд для поиска текста в большой бд
    #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
19 сообщений из 44, страница 2 из 2
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Помогите выбрать бд для поиска текста в большой бд
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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