SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 31.01.2014 14:07:02

Emmerich
Участник
Зарегистрирован: 12.01.2014
Сообщений: 6

поиск по большому объему данных или что я делаю не так

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

uncompress (data)

P.S. спасибо vasya
В поле data после разжатия лежит текст вида:

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

Т.е. на каждый id есть такой вот блок инфы про домен.
Таких вот доменов куча, к слову вся база весит не один Гб.
Поскольку домены могут повторяться, есть задача найти одинаковые.
Как я только не искала:

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? или есть более простой вариант или я где ошибку допускаю?

Неактивен

 

#2 31.01.2014 14:16:10

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: поиск по большому объему данных или что я делаю не так

Ваш запрос берет каждую строчку, распаковывает её, выполняет по ней поиск, переходит к следующей. Можно подождать час, день или неделю (зависит от размера базы).

Если запрос нужно выполнить единожды, то запустите второй вариант и ждите.
Если регулярно, то необходимо менять формат хранения. Например, вместо одного поля data делать три поля: body, title, domain и хранить там инфу не в сжатом виде.

Неактивен

 

#3 31.01.2014 15:39:50

Emmerich
Участник
Зарегистрирован: 12.01.2014
Сообщений: 6

Re: поиск по большому объему данных или что я делаю не так

Всё, поняла. СПАСИБО!

Неактивен

 

#4 31.01.2014 18:00:54

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: поиск по большому объему данных или что я делаю не так

Если будете хранить разархивированные данные вас устроит запрос без % в начале

select * from table where data like 'dieta-71kg%'

то он сможет использовать префиксный индекс на первые 20 символов data KEY(data(20)).
Но есть без regexp не обойтись, то индекс не поможет. Как вариант - храните первые 20 символов data в незаархивированной колонке.

Неактивен

 

#5 31.01.2014 18:09:38

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: поиск по большому объему данных или что я делаю не так

rgbeast написал:

Если будете хранить разархивированные данные вас устроит запрос без % в начале

select * from table where data like 'dieta-71kg%'

Не поможет, там ведь вхождение не в начале.

текст вида:

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

Неактивен

 

#6 31.01.2014 18:12:19

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: поиск по большому объему данных или что я делаю не так

Ясно, значит может быть оправдано разнесение всей этой информации по отдельным колонкам

Неактивен

 

#7 01.02.2014 19:01:39

Emmerich
Участник
Зарегистрирован: 12.01.2014
Сообщений: 6

Re: поиск по большому объему данных или что я делаю не так

это надо искать что то в строковых функциях? по типу функции explode в php? есть же аналог для mysql?

Неактивен

 

#8 01.02.2014 20:01:40

Emmerich
Участник
Зарегистрирован: 12.01.2014
Сообщений: 6

Re: поиск по большому объему данных или что я делаю не так

или лучше создать еще одно поле и просто перезалить разжатую инфу туда и потом искать обычным LIKE?

Неактивен

 

#9 01.02.2014 21:19:39

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: поиск по большому объему данных или что я делаю не так

Можно создать отдельную таблицу, где данные не будут заархивированы.

Функционал типа explode() можно реализовать с помощью  SUBSTRING_INDEX(str,delim,count) http://dev.mysql.com/doc/refman/5.0/en/ … ring-index
и SUBSTR()

Неактивен

 

#10 01.02.2014 21:20:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: поиск по большому объему данных или что я делаю не так

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

Если менять структуру, то логично сделать три отдельные колонки (body, domain, title).

А лучше опишите подробней задачу, которая перед вами стоит.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson