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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация запроса 
:(
    Опции темы
aktuba
Дата 27.11.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


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

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



Друзья, помогите оптимизировать запрос:
Код

SELECT
    news.id,
    news.user_login,
    news.user_id,
    news.uri,
    news.title,
    news.type,
    news.rating_plus,
    news.rating_minus,
    news.source,
    news.published_on,
    news.active,
    news.count_comments,
    news.dn_doc_id,
    news.dn_set_doc,
    news.dn_set_index,
    news.dn_set_category
FROM
    (
        SELECT
            news.id
        FROM
            news_docs nd
            JOIN news ON (news.id = nd.news_id)
            LEFT JOIN docs ON (news.dn_doc_id = docs.id)
            LEFT JOIN users u ON (u.id = 54558 AND u.active = '1')
            LEFT JOIN users_docs ud ON (ud.doc_id = 3983 AND ud.user_id = u.id )
        WHERE
            nd.doc_id = 3983 AND
            news.dn_set_doc = '1' AND
            news.active = '1' AND
            (
                IF (news.type = 'open', 1, ud.allowed) OR
                u.status <> 'user'
            )
    ) l
    JOIN news      ON (l.id = news.id)
ORDER BY
    news.title


Вот EXPLAIN:
Код

1    PRIMARY    <derived2>    ALL    NULL    NULL    NULL    NULL    465    Using temporary; Using filesort
1    PRIMARY    news    eq_ref    PRIMARY,test_access    PRIMARY    4    l.id    1     
2    DERIVED    nd    ref    unical,get_index_last_date    unical    3        531    Using index
2    DERIVED    news    eq_ref    PRIMARY,active,test_access,dn_set_doc    PRIMARY    4    base.nd.news_id    1    Using where
2    DERIVED    docs    eq_ref    PRIMARY    PRIMARY    3    base.news.dn_doc_id    1    Using index
2    DERIVED    u    const    PRIMARY,list,active    PRIMARY    3        1     
2    DERIVED    ud    ref    PRIMARY,doc_info,news_list    doc_info    6    base.u.id    1    Using where; Using index


Для меня EXPLAIN - китайская грамота, если честно. Единственное, за что уцепился взгляд - Using temporary; Using filesort.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Akina
Дата 27.11.2009, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



1) Зачем вообще используете в источнике таблицу docs? из неё ничего не выбирается, через неё ничего не джойнится.
2) зачем джойнится эта дикая конструкция:
Код
LEFT JOIN users u ON (u.id = 54558 AND u.active = '1')
LEFT JOIN users_docs ud ON (ud.doc_id = 3983 AND ud.user_id = u.id )
WHERE
(
 IF (news.type = 'open', 1, ud.allowed) OR
 u.status <> 'user'
)

? какая в ней великая мысль?

Вообще мне кажется, что ты писАл запрос "влоб", потому и монстр получился.



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

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


Смышленный
***


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

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



Цитата(Akina @ 27.11.2009,  16:47)
1) Зачем вообще используете в источнике таблицу docs? из неё ничего не выбирается, через неё ничего не джойнится.
2) зачем джойнится эта дикая конструкция:
Код
LEFT JOIN users u ON (u.id = 54558 AND u.active = '1')
LEFT JOIN users_docs ud ON (ud.doc_id = 3983 AND ud.user_id = u.id )
WHERE
(
 IF (news.type = 'open', 1, ud.allowed) OR
 u.status <> 'user'
)

? какая в ней великая мысль?

Вообще мне кажется, что ты писАл запрос "влоб", потому и монстр получился.

По поводу таблицы docs - согласен. Осталось от того, что было изначально (там еще доп.параметры собирались, после исключил их).
А по поводу users и users_docs - это необходимо, т.к. эти параметры определяют, какой пользователь какие документы может смотреть...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Akina
Дата 27.11.2009, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Ну так сделай по-человечески. Связи - в JOIN, фильтры - во WHERE. Если надо (а в данном случае это логично) - соедини эти таблицы в подзапросе. А у тебя часть тут, часть там...


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

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


Чо?
****


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

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




M
Zloxa
Перенесено из баз данных



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


Смышленный
***


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

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



Цитата(Akina @ 27.11.2009,  17:43)
Ну так сделай по-человечески. Связи - в JOIN, фильтры - во WHERE. Если надо (а в данном случае это логично) - соедини эти таблицы в подзапросе. А у тебя часть тут, часть там...

Ок, переделал:
Код

SELECT
    news.id,
    news.user_login,
    news.user_id,
    news.uri,
    news.title,
    news.type,
    news.rating_plus,
    news.rating_minus,
    news.source,
    news.published_on,
    news.active,
    news.count_comments,
    news.dn_doc_id,
    news.dn_set_doc,
    news.dn_set_index,
    news.dn_set_category
FROM
    news_docs nd
    JOIN news ON (news.id = nd.news_id)
    LEFT JOIN docs ON (news.dn_doc_id = docs.id)
    LEFT JOIN users u ON (u.id = 54558 AND u.active = '1')
    LEFT JOIN users_docs ud ON (ud.doc_id = 3983 AND ud.user_id = u.id )
WHERE
    nd.doc_id = 3983 AND
    news.dn_set_doc = '1' AND
    news.active = '1' AND
    (
        IF (news.type = 'open', 1, ud.allowed) OR
        u.status <> 'user'
    )
ORDER BY
    news.title


Но вопрос был немного в другом - как оптимизировать?


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Zloxa
Дата 27.11.2009, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(aktuba @  27.11.2009,  18:30 Найти цитируемый пост)
Но вопрос был немного в другом - как оптимизировать?

Давайте начнем с такой глупости:
Что заставляет вас думать, что запрос выполняется не оптимально?

Это сообщение отредактировал(а) Zloxa - 27.11.2009, 21:09


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


Смышленный
***


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

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



Время его выполнения. До 1 секунды уходит... Поэтому и хотелось бы узнать - можно ли вообще оптимизировать запрос и если да, то как.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Zloxa
Дата 27.11.2009, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(aktuba @  27.11.2009,  21:14 Найти цитируемый пост)
До 1 секунды

С чего вы взяли что это много?


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


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


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

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



Цитата(aktuba @  27.11.2009,  17:30 Найти цитируемый пост)
(        IF (news.type = 'open', 1, ud.allowed) OR        u.status <> 'user'    )

если разбить это на три взаимоисключающих условия и сделать union трех полученных запросов вместо использования этого громоздкого выражения, то, как мне кажется, получится перейти от using where к using index.
наверное.
конечно, можно было бы проэкспериментировать, имея на руках "облегченную" версию твоих таблиц.
PM MAIL   Вверх
Zloxa
Дата 27.11.2009, 23:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(skyboy @  27.11.2009,  23:37 Найти цитируемый пост)
т using where к using index

искать по индексу на неравенство нельзя.


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


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


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

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



ясно. в любом случае, зря я про сферических коней разговор поддержал smile
PM MAIL   Вверх
aktuba
Дата 28.11.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


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

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



Цитата(Zloxa @  27.11.2009,  22:34 Найти цитируемый пост)
С чего вы взяли что это много? 

С общего объема пользователей, запросов и т.д... Когда на сайте более 1млн. хитов в сутки - такие запросы здорово тормозят загрузку страницы =(

Добавлено через 2 минуты и 34 секунды
Цитата(skyboy @ 28.11.2009,  00:37)
Цитата(aktuba @  27.11.2009,  17:30 Найти цитируемый пост)
(        IF (news.type = 'open', 1, ud.allowed) OR        u.status <> 'user'    )

если разбить это на три взаимоисключающих условия и сделать union трех полученных запросов вместо использования этого громоздкого выражения, то, как мне кажется, получится перейти от using where к using index.
наверное.
конечно, можно было бы проэкспериментировать, имея на руках "облегченную" версию твоих таблиц.

Не думаю, что это сильно поможет, т.к. большинство документов имеют статус open.
Можно конечно заменить u.status <> 'user' на u.status IN ('admin', 'moderator'), но сильно ли это поможет?


--------------------
user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 28.11.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(aktuba @  28.11.2009,  14:52 Найти цитируемый пост)
т.к. большинство документов имеют статус open.

в смысле, u.status = "open"?
Цитата(aktuba @  28.11.2009,  14:52 Найти цитируемый пост)
Можно конечно заменить u.status <> 'user' на u.status IN ('admin', 'moderator'), но сильно ли это поможет?

будет использовать индекс, я считаюверю(раз нет реальных данных - не могу проверить, а раз не уверен на 100% - значит, это просто вера такая smile).
PM MAIL   Вверх
Akina
Дата 28.11.2009, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(aktuba @  28.11.2009,  16:52 Найти цитируемый пост)
Можно конечно заменить u.status <> 'user' на u.status IN ('admin', 'moderator'), но сильно ли это поможет? 

Эта фраза говорит о том, что тип поля - текст? или всё-таки энум? 
Кстати, поможет.


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

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


 




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


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

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