Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите оптимизировать MySQL запрос, жутко тормозит 
:(
    Опции темы
gid
  Дата 21.12.2007, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 1.5.2005
Где: Россия

Репутация: нет
Всего: нет



Здравствуйте, суть проблемы такая: есть таблица с ~90.000 записей, которая имеет следующую структуру:

Код

TABLE `all` (
  `url` mediumint(8) NOT NULL auto_increment,
  `title` text NOT NULL,
  `text` text NOT NULL,
  `short_text` varchar(400) NOT NULL,
  `category` char(30) NOT NULL,
  `category_2` char(120) NOT NULL,
  `date` int(10) NOT NULL,
  `2md5` char(64) NOT NULL,
  UNIQUE KEY `url` (`url`),
  UNIQUE KEY `2md5` (`2md5`),
  KEY `date` (`date`),
  KEY `category` (`category`),
  KEY `category_2` (`category_2`),
  KEY `short_text` (`short_text`),
  FULLTEXT KEY `title` (`title`)
)


Запрос:
Код

SELECT url,title,short_text,category,category_2,date
FROM `all` 
WHERE (
(
`category_2` LIKE '%бумага%'
)
AND (
`category`='vasya' OR `category`='petya' OR `category`='sasha' OR `category`='masha' OR `category`='dima' OR `category`='olya'
)
)
ORDER BY date DESC
LIMIT 1100 , 10


выполняется по 10-15 секунд. Может есть какой способ ускорить выборку данных с помощью оптимизации запроса\таблицы?

Основной тормоз этого запроса как я понимаю, является `category_2` LIKE '%бумага%', но чем его заменить даже не представляю... т.к. в поле category_2 могут содержаться и 'черная бумага' и 'цветная бумага'.... Всю голову уже изломал, но ничего реально работающего так и не придумал...

ps
поиск по форуму ничего дельного не дал...
PM MAIL WWW ICQ   Вверх
skyboy
Дата 21.12.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



нормализовть можно?
попробуй EXPLAIN своему запросу сделать.

Добавлено через 13 секунд
нет, не надо EXPLAIN, все равно бесполезно. уж больно запрос нагружающий.
при данному использовании индексы не помогут.
разве что - полнотекстовые.

Добавлено через 2 минуты и 42 секунды
самый простой "костыль": заменить like на locate
но, как мне кажется, проблему это не решит.
тут бы структуру базы переделать как-то, чтоб подобных запросов избежать
PM MAIL   Вверх
Akina
Дата 23.12.2007, 22:15 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Код

(
`category`='vasya' OR `category`='petya' OR `category`='sasha' OR `category`='masha' OR `category`='dima' OR `category`='olya'
)

замените на 
Код

(
`category` IN ('vasya','petya','sasha','masha','dima','olya')
)

Не суть, конечно, но по крайней мере покороче будет... а вот с Like, который и есть основной тормоз, без полнотекста по полю ничего не сделать...

PS. Неужели это `category_2` не формализуется?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Komatoz
Дата 24.12.2007, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 2.7.2004
Где: Ю-Сахалинск

Репутация: нет
Всего: нет



С таким кол-вом записей врядли что поможет..

только если качество сети и оборудование улучшать

Это сообщение отредактировал(а) Komatoz - 24.12.2007, 08:16
PM MAIL WWW   Вверх
gid
Дата 25.12.2007, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 1.5.2005
Где: Россия

Репутация: нет
Всего: нет



Akina, спасибо! Прирост производительности за счет использования `category` IN (...) получился весьма значительный... теперь запрос выполняется уже не 15 секунд а 3-7 секунды!

На счет формализации нужно подумать, но пока вот что придумал:

Для поля category_2 создать отдельную таблицу (что-то похожее на индекс), в которой будет всего два поля:
id_записи - для указания в первой таблице
все_возможные_названия_этой_категории - для создания нового запроса
и при запросе сперва делать выборку по таблице с категориями, а на основании уже полученных данных делать запрос по основной таблице с точным указанием нужных категорий... думаю будет работать значительно быстрее.
PM MAIL WWW ICQ   Вверх
Akina
Дата 25.12.2007, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0480 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.