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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация sql-запроса в MySQL, Оптимизация slow-query 
:(
    Опции темы
Zerstroer
Дата 17.11.2011, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день всем.
У меня возникла проблема. Имеется приложение, в котором выполняется следующий SQL-запрос:

Код

select it.itemid, it.key_, it.hostid, it.templateid from
                items it, items i, hosts h, fixed_settings fs, fixed_settings fs2
                where
                it.hostid = ~~hostid#!
                and it.templateid = i.itemid
                and i.hostid = h.hostid
                and h.host = fs.value 
                and fs.`key` = 'TMPL_FOR_CM230' 
                and i.key_ = fs2.value
                and fs2.search_data = \"~~num#!\" 
                limit 1;


Где ~~hostid#! и ~~num#! - parameter values - то есть значения которые подставляются при каждом использовании запроса.
Запрос ведется из 3-х таблиц: 
items содержит порядка 7000 записей
hosts - порядка 1000 записей
fixed_settings - около 100 записей
индексы на таблицы не установлены

В конфигах MySQL
long_query_time = 10

В общем, проблема заключается в том, что этот запрос вываливается в slow query log. Эту проблему мне необходимо устранить. 
Каким образом методически правильно решать подобные проблемы?



--------------------
In silico
PM MAIL ICQ   Вверх
AndreyIQ
Дата 17.11.2011, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я конечно в MySQL не силен но
Цитата

индексы на таблицы не установлены

это Вы жестоко поступили
PM MAIL   Вверх
Akina
Дата 17.11.2011, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Zerstroer @  17.11.2011,  15:29 Найти цитируемый пост)
items содержит порядка 7000 записей
hosts - порядка 1000 записей
fixed_settings - около 100 записей

Первая и третья таблицы использованы дважды. Итого - декартово произведение на полквадриллиона записей... это надо не в slow query log смотреть, а в зеркало...

Добавлено через 1 минуту и 37 секунд
Да и LIMIT 1 без ORDER BY тоже смотрится экзотично...


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

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


Чо?
****


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

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



Цитата(Zerstroer @  17.11.2011,  14:29 Найти цитируемый пост)
Каким образом методически правильно решать подобные проблемы?

1) Необходимо разделить критерии объединения и критерии фильтрации. Если существует инвариантность в определении критериив объединения (а она у вас есть), в качестве критериев объединения выбираем те, которое позволяют отсечь большее количество записей, остальные - считаем критериями фильтрации
2) Необходимо выбрать лидирующую таблицу, фильтр по которой отсечет наибольшее количество записей из результата. Ваша выборка извне получает два параметра и один задан константой. В вашем случае лидирующими могут быть наборы  либо it, либо  fs, либо fs2
3) Индексировать в лидирущей таблице те поля, по которым производится отбор. В вашем случае это либо items(hostid), либо fixed_settings(key), либо fixed_settings(search_data).
4) Индексировать в присоединяемых к лидирующей таблицах те поля, по которым производится объединение. 
5) форсить использование индексов и зафиксировать порядок объединения.

Цитата(Zerstroer @  17.11.2011,  14:29 Найти цитируемый пост)
items содержит порядка 7000 записей
hosts - порядка 1000 записей
fixed_settings - около 100 записей

На таких объемах, десять секунд выглядят нонсенсом.

Добавлено через 8 минут и 38 секунд
Семантика запроса взорвала мозг, насиловать далее его в поисках дельного совета - не могу более.

Это сообщение отредактировал(а) Zloxa - 17.11.2011, 16:19


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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