Форум программистов, компьютерный форум, киберфорум
Наши страницы
MySQL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Emmerich
0 / 0 / 0
Регистрация: 12.01.2014
Сообщений: 5
1

Поиск по большому массиву данных

31.01.2014, 13:52. Просмотров 684. Ответов 6
Метки нет (Все метки)

Люди, подскажите кто знает или может встречался с этим! Перечитала кучу всего, но конкретной инфы не нашла.
Есть таблица с 2-мя полями: id (ключ) и data (blob).
data сжата и инфа становится удобочитаемой после выполнения
MySQL
1
uncompress (data)
В поле data после разжатия лежит текст вида:

body: Диета, как похудеть
domain: dieta-71kg.ru
title: Все о диетах

Т.е. на каждый id есть такой вот блок инфы про домен.
Таких вот доменов куча, к слову вся база весит не один Гб.
Поскольку домены могут повторяться, есть задача найти одинаковые.
Как я только не искала:
MySQL
1
2
3
select * from table where uncompress (data) rlike 'dieta-71kg\.ru'
select * from table where uncompress (data) like '%dieta-71kg%'
select * from table where uncompress (data) regexp 'dieta[:punct:]71kg\.ru'
и т.д.
Ошибок код не выдает, сижу жду 10 мин, полчаса, час... сервер всё обрабатывает и обрабатывает.... я не выдерживаю и убиваю процесс и пробую другую вариацию и опять также.
Прочитала про fulltext, но он не работает с blob.
Вопрос: я правильно делаю и может просто надо подождать часа так 3? или есть более простой вариант или я где ошибку допускаю?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2014, 13:52
Ответы с готовыми решениями:

Поиск по массиву в MySQL
У меня есть массив в php: array("123", "as2", "2dd", "asd"); и тд Далее я...

Добавить двумерных массивов к 1 большому двумерному массиву
есть 9 мелких массивов и 1 большой, который по длине равен суммам длин всех...

Не работает поиск по массиву данных + datagridview
Всем привет! Помогите пожалуйста:cry: с задачей - происходит что-то...

Как сделать быстрый поиск по массиву разнотипных данных?
Как сделать быстрый поиск по массиву и разнотипных данных?

Поиск по большому текстовому файлу
Имеется файл в 400 тысяч строк. В каждой строке содержится исходное слово и...

6
cygapb-007
1306 / 938 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
31.01.2014, 16:48 2
Лучший ответ Сообщение было отмечено Emmerich как решение

Решение

попробуйте
MySQL
1
2
3
4
5
6
select id,
  @txt:=uncompress(data) txt,
  @s:=locate('domain:',@txt) s, @e:=locate(char(10),@txt,@s+8) e,
  if(@s>0,substr(@txt,@s+8,@e-(@s+8)),'') url
from `table` t
limit 0,100
Если будет выполняться за приемлемое время, дальше можно
MySQL
1
2
3
4
5
6
7
8
9
10
11
select t.url, group_concat(t.id) ids
from(
  select id,
    @txt:=uncompress(data) txt,
    @s:=locate('domain:',@txt) s, @e:=locate(char(10),@txt,@s+8) e,
    if(@s>0,substr(@txt,@s+8,@e-(@s+8)),'') url
  from `table` t
  limit 0,100
  )t
group by t.url
having count(*)>1
дальше - играться с LIMIT до полного решения задачи...
Вплоть до
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
create temporary table temp(
  id int,
  url varchar(1000),
  key(url));
 
insert temp
select t.id, t.url
from(
  select id,
    @txt:=uncompress(data) txt,
    @s:=locate('domain:',@txt) s, @e:=locate(char(10),@txt,@s+8) e,
    if(@s>0,substr(@txt,@s+8,@e-(@s+8)),'') url
  from `table` t
  )t;
 
select url, group_concat(id)ids
from temp
group by url
having count(*)>1;
 
drop temporary table temp;
1
Emmerich
0 / 0 / 0
Регистрация: 12.01.2014
Сообщений: 5
31.01.2014, 18:32  [ТС] 3
cygapb-007, Спасибо огромное!!!!!!!!!!!!!!!!
Вы первый и единственный, который смог дать ответ, а не посоветовать вырвать руки человеку, который создал такую таблицу со сжатым полем типа blob))
Спасибо за потраченное время
У меня вопрос по вашему первому коду. Не кидайте тапками, я только учусь работать с mysql и мне немного сложновато
у меня код воспроизвелся на ура, за пару секунд без ошибок. вывел инфу по первым 100 id. Куда вставить требуемый урл, чтоб его найти (например mail.ru). Еще раз сори за глупый вопрос.
MySQL
1
2
3
4
5
6
select id,
  @txt:=uncompress(data) txt,
  @s:=locate('domain:',@txt) s, @e:=locate(char(10),@txt,@s+8) e,
  if(@s>0,substr(@txt,@s+8,@e-(@s+8)),'') url
from `table` t
limit 0,100
0
cygapb-007
1306 / 938 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
31.01.2014, 21:41 4
если url вывелся правильно - запускайте третий скрипт сразу

Добавлено через 3 минуты
Ну или
Цитата Сообщение от Emmerich Посмотреть сообщение
Куда вставить требуемый урл, чтоб его найти (например mail.ru).
MySQL
1
2
3
4
5
6
7
select id,
  @txt:=uncompress(data) txt,
  @s:=locate('domain:',@txt) s, @e:=locate(char(10),@txt,@s+8) e,
  @url:=if(@s>0,substr(@txt,@s+8,@e-(@s+8)),'') url
from `table` t
where @url like '%mail.ru%' -- не уверен, может и сработает...
limit 0,100
0
Emmerich
0 / 0 / 0
Регистрация: 12.01.2014
Сообщений: 5
01.02.2014, 18:56  [ТС] 5
После того, как в 1-й скрипт вставила имя урла, уменьшила лимит со 100 до 2 скрипт обрабатывается в течение уже минут 10...
пробовала по Вашему совету 3-й скрипт, но видимо у меня нет прав на создание и редактирование таблиц внутри базы:
MySQL
1
ERROR 1044 (42000): Access denied for user 'search'@'5.45.202.220' to database 'moddb'
Добавлено через 2 часа 20 минут
еще мне советуют разбить это поле на несколько полей: отдельно сделать поле с именем домена и отдельно остальная часть (body и title). Но как я понимаю, это же идет изменение структуры таблицы и такая операция будет запрещена для меня
0
cygapb-007
1306 / 938 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
03.02.2014, 10:38 6
Emmerich, а если второй скрипт и без LIMIT ?

или
MySQL
1
2
3
4
5
6
7
8
9
10
select t.id, t.url
from(
  select id,
    @txt:=uncompress(data) txt,
    @s:=locate('domain:',@txt) s, @e:=locate(char(10),@txt,@s+8) e,
    if(@s>0,substr(@txt,@s+8,@e-(@s+8)),'') url
  from `table` t
  -- limit 0,100
  )t
where t.url like '%mail.ru%';
1
Emmerich
0 / 0 / 0
Регистрация: 12.01.2014
Сообщений: 5
03.02.2014, 23:51  [ТС] 7
Слушай, даже что то заработало )))
Без limit уходит в себя надолго, ждала минут 5, дольше не стала. Поэтому только с ограничением.
Пример 2-го скрипта:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> SELECT t.cid, t.url
    -> FROM(
    ->   SELECT cid,
    ->     @txt:=uncompress(DATA) txt,
    ->     @s:=locate('domain:',@txt) s, @e:=locate(CHAR(10),@txt,@s+8) e,
    ->     IF(@s>0,substr(@txt,@s+8,@e-(@s+8)),'') url
    ->   FROM mod_banners t
    ->   LIMIT 0,10
    ->   )t
    -> WHERE t.url LIKE '%skyweb.ru%' \g
+-----+------------------------+
| cid | url                    |
+-----+------------------------+
| 112 | [url]www.skyweb.ru[/url]          |
| 112 | [url]www.skyweb.ru[/url]          |
| 118 | [url]www.skyweb.ru/host.php[/url] |
+-----+------------------------+
3 ROWS IN SET (0.01 sec)
Последний скрипт:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> SELECT t.url, group_concat(t.cid) ids
    -> FROM(
    ->   SELECT cid,
    ->     @txt:=uncompress(DATA) txt,
    ->     @s:=locate('domain:',@txt) s, @e:=locate(CHAR(10),@txt,@s+8) e,
    ->     IF(@s>0,substr(@txt,@s+8,@e-(@s+8)),'') url
    ->   FROM mod_banners t
    ->   LIMIT 0,10
    ->   )t
    -> WHERE t.url LIKE '%skyweb.ru%'
    -> GROUP BY t.url
    -> HAVING COUNT(*)>1 \g
+---------------+---------+
| url           | ids     |
+---------------+---------+
| [url]www.skyweb.ru[/url] | 112,112 |
+---------------+---------+
1 ROW IN SET (0.00 sec)
Но появилась еще проблема - он почему то не все урлы видит, т.е. я знаю, что сайт есть в базе, а он мне пустой ответ возвращает. Пример:
SQL
1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT t.cid, t.url
    -> FROM(
    ->   SELECT cid,
    ->     @txt:=uncompress(DATA) txt,
    ->     @s:=locate('domain:',@txt) s, @e:=locate(CHAR(10),@txt,@s+8) e,
    ->     IF(@s>0,substr(@txt,@s+8,@e-(@s+8)),'') url
    ->   FROM mod_banners t
    ->   LIMIT 0,10
    ->   )t
    -> WHERE t.url LIKE '%giacint.ru%' \g
Empty SET (0.00 sec)
Добавлено через 13 минут
А нет, это я дура просто )))
Не обратила внимания где стоит limit. Получается, что в данном случае он ограничивает не кол-во выдаваемых данных, соответствующих образцу, а кол-во записей, по которым он ищет Ура
Увеличила до 10.000 и требуемый урл нашелся.
ЕЩЕ РАЗ ГРОМАДНОЕ СПАСИБО!!!
0
03.02.2014, 23:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2014, 23:51

Ускорить бинарный поиск по большому словарю
Добрый день! Словарь из 500 тысяч слов на русском языке. Словарь...

Быстрый поиск по большому файлу (до нескольких гигабайт)
Как можно организовать быстрый поиск по файлу? Файл может весить гигабайты....

Создание отчета в excel по большому количеству данных
Ребята, помогите, кто может! Очень срочно надо! Нужно создать такой отчет (в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru