![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
Добрый день всем.
У меня возникла проблема. Имеется приложение, в котором выполняется следующий SQL-запрос:
Где ~~hostid#! и ~~num#! - parameter values - то есть значения которые подставляются при каждом использовании запроса. Запрос ведется из 3-х таблиц: items содержит порядка 7000 записей hosts - порядка 1000 записей fixed_settings - около 100 записей индексы на таблицы не установлены В конфигах MySQL long_query_time = 10 В общем, проблема заключается в том, что этот запрос вываливается в slow query log. Эту проблему мне необходимо устранить. Каким образом методически правильно решать подобные проблемы? -------------------- In silico |
|||
|
||||
AndreyIQ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 5.2.2007 Репутация: 2 Всего: 8 |
Я конечно в MySQL не силен но
это Вы жестоко поступили |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Первая и третья таблицы использованы дважды. Итого - декартово произведение на полквадриллиона записей... это надо не в slow query log смотреть, а в зеркало... Добавлено через 1 минуту и 37 секунд Да и LIMIT 1 без ORDER BY тоже смотрится экзотично... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
1) Необходимо разделить критерии объединения и критерии фильтрации. Если существует инвариантность в определении критериив объединения (а она у вас есть), в качестве критериев объединения выбираем те, которое позволяют отсечь большее количество записей, остальные - считаем критериями фильтрации 2) Необходимо выбрать лидирующую таблицу, фильтр по которой отсечет наибольшее количество записей из результата. Ваша выборка извне получает два параметра и один задан константой. В вашем случае лидирующими могут быть наборы либо it, либо fs, либо fs2 3) Индексировать в лидирущей таблице те поля, по которым производится отбор. В вашем случае это либо items(hostid), либо fixed_settings(key), либо fixed_settings(search_data). 4) Индексировать в присоединяемых к лидирующей таблицах те поля, по которым производится объединение. 5) форсить использование индексов и зафиксировать порядок объединения.
На таких объемах, десять секунд выглядят нонсенсом. Добавлено через 8 минут и 38 секунд Семантика запроса взорвала мозг, насиловать далее его в поисках дельного совета - не могу более. Это сообщение отредактировал(а) Zloxa - 17.11.2011, 16:19 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MySQL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |