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

Поиск:

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


Опытный
**


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

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



Помогите оптимизировать этот запрос: 
Код

SELECT * 
FROM `ca` 
WHERE `type`=3 
 AND `id` IN (175,162,223,198) 
 AND (`limcnt`>`summlim` OR `limcnt`=0) 
 AND 
   (((`hourlim`>`summtohour` OR `hourlim`=0) 
        AND (`daylim`>`summtoday` OR `daylim`=0) 
        OR (`contday`!='2009-03-27'))) 
 AND `id` NOT IN ( 
  SELECT `cid` 
  FROM `pa` 
  WHERE `cid`!='0' 
  UNION 
  SELECT `cid` 
  FROM `pn` 
  WHERE `cid`!='0' ) 
ORDER BY priority, RAND()

среднее время выполнения: 0.005
Нужно данный запрос ускорить примерно до 0.002

Где может быть торможение.

P.S.
Я понимаю что все зависит от машины и типов данных - но что еще может тормозить в запросе. Может есть рекомендации как объединить например вложенные запросы (таблицы pn и pa - идентичны по структуре.

Это сообщение отредактировал(а) skyboy - 28.3.2009, 11:42
PM MAIL ICQ   Вверх
skyboy
Дата 28.3.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



в mysql профайлинг(диагностика производительности) запроса делается так:
Код

EXPLAIN <твой SELECT-запрос>

в результате выполнения ты узнаешь много интересных вещей(в том числе, что из-за order by rand() происходит создание временной таблицы или что подзапрос тоже дает временную таблицу, возможно - ещё и с сортировкой из-за union).
вот выполни и выложи результат здесь.
потому что реальные данные только и тебя.
и мы, глядя только на запрос, можем посоветовать тебе не использовать order by rand(), а потом окажется, что у тебя, к примеру, в таблице `ca` три несчастных записи, зато в `pa` - 1.5 млн записей без нужного индекса и оптимизация по таблице `ca` ничего не даст.
Так что выполняй профайлинг и давай сюда результаты.

Добавлено через 57 секунд
когда будешь вставлять на форуме результаты SELECT, используй, пожалуйста, "цитату", а не "код".
Ты бы видел, как адски распирает форум от запросов в теге "код", если ты не используешь переводы строки...
PM MAIL   Вверх
ArNic
Дата 23.12.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

когда будешь вставлять на форуме результаты SELECT, используй, пожалуйста, "цитату", а не "код".
Ты бы видел, как адски распирает форум от запросов в теге "код", если ты не используешь переводы строки...

Ок. Поставил на заметку.

Это сообщение отредактировал(а) ArNic - 23.12.2009, 10:19
PM MAIL ICQ   Вверх
Zloxa
Дата 23.12.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(ArNic @  27.3.2009,  19:41 Найти цитируемый пост)
среднее время выполнения: 0.005
Нужно данный запрос ускорить примерно до 0.002

Только железом, ИМХО.
Или менять архитектуру.
Если столь малое время выполенния является проблемой, видимо надо найти способ реже выполнять.
СУБД не обещают работы в рилтайме.

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


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DimW
Дата 24.12.2009, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ArNic @  27.3.2009,  19:41 Найти цитируемый пост)
Где может быть торможение.

пальцем в небо:

Цитата(ArNic @  27.3.2009,  19:41 Найти цитируемый пост)
`cid`!='0'


какой тип данных у поля cid?
если числовой то почему вы взяли его в опострафы - попахивает не явным преобразованием типов из varchar в integer.
может ли cid быть меньше 0?
если нет, то стоит попробывать использовать не условие по отрицанию, а cid > 0.

так же попробывать NOT IN заменить на NOT EXISTS, зависит от того на сколько много данных возвращает под запрос...

еще раз, все это предположения основанные на том что "одно место" чувствует что это может повлиять на скорость выполнения запроса.
в какую сторону сами увидите...  

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


 




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


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

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