Форум программистов, компьютерный форум, киберфорум
Наши страницы

MySQL

Войти
Регистрация
Восстановить пароль
 
Emmerich
0 / 0 / 0
Регистрация: 12.01.2014
Сообщений: 5
#1

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

31.01.2014, 13:52. Просмотров 665. Ответов 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):

Поиск по массиву в MySQL - MySQL
У меня есть массив в php: array("123", "as2", "2dd", "asd"); и тд Далее я вычисляю насколько они разные: public static function...

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

Не работает поиск по массиву данных + datagridview - C#
Всем привет! Помогите пожалуйста:cry: с задачей - происходит что-то непонятное((( Суть задачу в том, что пользователь вводит фамилию,...

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

Поиск по большому текстовому файлу - C#
Имеется файл в 400 тысяч строк. В каждой строке содержится исходное слово и производные от него, в конце строки стоит ;. Например: ...

Ускорить бинарный поиск по большому словарю - C#
Добрый день! Словарь из 500 тысяч слов на русском языке. Словарь отсортирован, использую BinarySearch(), но хотелось бы еще повысить...

6
cygapb-007
1306 / 938 / 143
Регистрация: 17.01.2013
Сообщений: 2,348
31.01.2014, 16:48 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
попробуйте
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 / 143
Регистрация: 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 / 143
Регистрация: 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
Привет! Вот еще темы с ответами:

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

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

Поиск по массиву - C++
Некоторый массив содержит повторяющиеся элементы, нужно найти количество различных элементов в нём. #include<stdio.h> #include<conio.h>...

Поиск по массиву - Delphi
Здраствуйте. Єсть некая порблема...Єсть у нас з Екселя загруженая таблица данных .Как в ней сделать поиск, что б например при вводе в...


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

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

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