Оптимизация MySQL Slow Query

Главные вкладки

Аватар пользователя dcdr dcdr 7 ноября 2013 в 19:56

Доброго времени суток!
Нужен дельный совет. При помощи Views создается запрос, но время его выполнения несколько велико.

Первая загрузка - тут все плохо((
Executed 350 queries in 823.4 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 1367.98 ms.

SELECT DISTINCT node.nid AS nid, node.created AS node_created, node.title AS node_title, node_comment_statistics.comment_count AS node_comment_statistics_comment_count, node_data_field_urgently.field_urgently_value AS node_data_field_urgently_field_urgently_value, node.type AS node_type, node.vid AS node_vid, node.sticky AS node_sticky
FROM node node
INNER JOIN node_comment_statistics node_comment_statistics ON node.nid = node_comment_statistics.nid
LEFT JOIN content_type_photo_post node_data_field_urgently ON node.vid = node_data_field_urgently.vid
WHERE (
node.status =1
)
AND (
node.type
IN (
'video',  'text',  'photo'
)
)
ORDER BY node_sticky DESC , node_created DESC
LIMIT 0 , 6

По phpmyadmin: Отображает строки 0 - 5 ( 6 всего, Запрос занял 0.7448 сек.)

повторное обновление(этого запроса нет):
Executed 330 queries in 30.42 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 494.06 ms.

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE node ref PRIMARY,node_status_type,node_type node_status_type 4 const 23054 Using where; Using temporary; Using filesort
1 SIMPLE node_comment_statistics eq_ref PRIMARY PRIMARY 4 *.node.nid 1
1 SIMPLE node_data_field_urgently eq_ref PRIMARY PRIMARY 4 *.node.vid 1

куда стоит копать?

Комментарии

Аватар пользователя sg85 sg85 7 ноября 2013 в 20:42

при повторном обновлении Вы ловите кеш, отсюда такая разница.

Что-то я не разглядел узких мест в запросе, либо я слепой, либо что-то не так с сервером.

(вообще там самое тяжелое это DISTINCT, однако он обычно даже на целероне работает быстрее)

Аватар пользователя dcdr dcdr 8 ноября 2013 в 11:13

sg85 wrote:
при повторном обновлении Вы ловите кеш, отсюда такая разница.

Что-то я не разглядел узких мест в запросе, либо я слепой, либо что-то не так с сервером.

(вообще там самое тяжелое это DISTINCT, однако он обычно даже на целероне работает быстрее)


вопрос не про кеш. более 300 запросов выполняются за 20мс., а этот запрос почти секунда. Отсюда вопрос, можно это время уменьшить конфигурацией mysql или нужно копать в сторону индексов?

Аватар пользователя sg85 sg85 8 ноября 2013 в 12:31

"dcdr" wrote:
или нужно копать в сторону индексов

а смысл? что бы это сработало, необходимо, что бы node.type, node.status, node.created, node.sticky были единым ключом, кроме того, проблему это не решит(хотя, возможно, чуть чуть ускорит), словом, весьма сомнительное действие.

для начала попробуйте выполнить этот запрос без сортировки, мне кажется проблема именно в ней(либо её сочетании с чем-то, например, DISTINCT).
Узким местом могут быть временные таблицы, используемые для DISTINCT, либо слишком мелкий размер буфера для сортировки(при заполнении буфера данные скидываются на жесткий диск - слишком маленький буфер = 100500 операций с диском для одной сортировки), та же ерунда с буфером строк уже на возврате, однако, последние 2 пункта маловероятны ввиду использования LIMIT в запросе, который должен был прекратить все это безобразие сразу, как будет найдено 6 строк.

Но в любом случае, этот запрос должен выполняться быстро даже на допотопном железе с дефолтными настройками, копайте в сторону настроек БД.

Еще можно нанять RxB, он все сделает Wink

Аватар пользователя dcdr dcdr 8 ноября 2013 в 18:44

sg85 wrote:
"dcdr" wrote:
или нужно копать в сторону индексов

Но в любом случае, этот запрос должен выполняться быстро даже на допотопном железе с дефолтными настройками, копайте в сторону настроек БД.

Еще можно нанять RxB, он все сделает ;)


с дефолтными еще не пробовал, но конфиг mysql подкрутили, теперь время уменьшилось раза в 4-5

RxB на предохранителе;) может понадобится аудит провести, как-нибудь

Аватар пользователя Crea Crea 9 ноября 2013 в 0:57

Добавьте составной индекс:
type, status, sticky, created
Тормозит, потому что сортировка не использует индекс