ФорумРазработкаБазы данных → Помогите с оптимизацией запроса

Помогите с оптимизацией запроса

  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 24 ноября 2009 г. 15:56

    Запрос:
    SELECT T.*, U.`avatar`, U.`login`, B.`name` AS `blog_name`, B.`sname` AS `blog_sname`, F.`id` AS `favourite`, R.`id` as `rated`, BM.`id` AS `moderator`, PV.`answer_id`
    FROM `live-cs_topics`AS T

    JOIN `live-cs_blogs` AS B
    ON B.`id`=T.`parent_id`

    LEFT JOIN `live-cs_users` AS U
    ON T.`author`=U.`id`

    LEFT JOIN `live-cs_blogs-moders` AS BM
    ON BM.`blog_id`=B.`id` AND BM.`user_id`=1

    LEFT JOIN `live-cs_topics-fav` AS F
    ON F.`topic_id`=T.`id` AND F.`user_id`=1

    LEFT JOIN `live-cs_topics-rating` AS R
    ON R.`topic_id`=T.`id` AND R.`user_id`=1

    LEFT JOIN `live-cs_poll-votes` AS PV
    ON PV.`poll_id`=T.`id` AND PV.`user_id`=1

    WHERE T.`deleted`='0'
    ORDER BY T.`date` DESC
    LIMIT 0, 10

    он отрабатывает за 1-1.5 секунды, там 10 000 записей
    такой же запрос, но с доп. условиями, лимит по дате — отрабатывает за 0.003

    explain:
    +—-+————-+——-+——–+——————————-+————-+———+—————————+——+———————————+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    +—-+————-+——-+——–+——————————-+————-+———+—————————+——+———————————+
    | 1 | SIMPLE | B | ALL | PRIMARY | NULL | NULL | NULL | 21 | Using temporary; Using filesort |
    | 1 | SIMPLE | T | ref | parent_id,deleted,parent_id_2 | parent_id_2 | 4 | live-cs.B.id | 264 | Using where |
    | 1 | SIMPLE | U | eq_ref | PRIMARY | PRIMARY | 4 | live-cs.T.author | 1 | |
    | 1 | SIMPLE | BM | eq_ref | blog_id | blog_id | 8 | live-cs.T.parent_id,const | 1 | Using index |
    | 1 | SIMPLE | F | eq_ref | user_id | user_id | 8 | const,live-cs.T.id | 1 | Using index |
    | 1 | SIMPLE | R | eq_ref | user_id | user_id | 8 | const,live-cs.T.id | 1 | Using index |
    | 1 | SIMPLE | PV | eq_ref | poll_id | poll_id | 8 | live-cs.T.id,const | 1 | |
    +—-+————-+——-+——–+——————————-+————-+———+—————————+——+———————————+


    сама страница для наглядности — http://live-cs.ru/topic/
    т.е. выводятся все топики, с постраничной разбивкой
    сам COUNT считает за 0.004, видимо тормоза в джоинах, т.к. тут юзается единственный индекс при выборке — deleted и date при сортировке

    но все джоины идут по id с primary индексами

    как отсечь тормоза?
    Спустя 241 сек.
    и как же у меня все-таки красиво оформлены запросы :) ну просто загляденье :)
    все умрут, а я изумруд
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 24 ноября 2009 г. 16:07, спустя 11 минут 23 секунды

    А чего для B не юзается индекс, скажи мускулю чтобы явно юзал примари (id)
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 24 ноября 2009 г. 16:08, спустя 55 секунд

    ты привел explain для лимитированного?
    Сапожник без сапог
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 24 ноября 2009 г. 16:10, спустя 2 минуты 14 секунд


    А чего для B не юзается индекс, скажи мускулю чтобы явно юзал примари (id)
    каким образом?
    Спустя 13 сек.

    ты привел explain для лимитированного?
    да, для того, что тут изобразил
    все умрут, а я изумруд
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 24 ноября 2009 г. 16:17, спустя 6 минут 18 секунд

    md5, без лимита покажи эксплейн
    Сапожник без сапог
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 24 ноября 2009 г. 16:21, спустя 4 минуты 31 секунду

    mysql> explain SELECT T.*, U.`avatar`, U.`login`, B.`name` AS `blog_name`, B.`sname` AS `blog_sname`, F.`id` AS `favourite`, R.`id` as `rated`, BM.`id` AS `moderator`, PV.`answer_id` FROM `live-cs_topics`AS T  JOIN `live-cs_blogs` AS B ON B.`id`=T.`parent_id`  LEFT JOIN `live-cs_users` AS U ON T.`author`=U.`id`  LEFT JOIN `live-cs_blogs-moders` AS BM ON BM.`blog_id`=B.`id` AND BM.`user_id`=1  LEFT JOIN `live-cs_topics-fav` AS F ON F.`topic_id`=T.`id` AND F.`user_id`=1  LEFT JOIN `live-cs_topics-rating` AS R ON R.`topic_id`=T.`id` AND R.`user_id`=1  LEFT JOIN `live-cs_poll-votes` AS PV ON PV.`poll_id`=T.`id` AND PV.`user_id`=1  WHERE T.`deleted`='0' ORDER BY T.`date` DESC;
    +—-+————-+——-+——–+——————————-+———–+———+—————————+——+———————————+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    +—-+————-+——-+——–+——————————-+———–+———+—————————+——+———————————+
    | 1 | SIMPLE | B | ALL | PRIMARY | NULL | NULL | NULL | 21 | Using temporary; Using filesort |
    | 1 | SIMPLE | T | ref | parent_id,deleted,parent_id_2 | parent_id | 4 | live-cs.B.id | 203 | Using where |
    | 1 | SIMPLE | U | eq_ref | PRIMARY | PRIMARY | 4 | live-cs.T.author | 1 | |
    | 1 | SIMPLE | BM | eq_ref | blog_id | blog_id | 8 | live-cs.T.parent_id,const | 1 | Using index |
    | 1 | SIMPLE | F | eq_ref | user_id | user_id | 8 | const,live-cs.T.id | 1 | Using index |
    | 1 | SIMPLE | R | eq_ref | user_id | user_id | 8 | const,live-cs.T.id | 1 | Using index |
    | 1 | SIMPLE | PV | eq_ref | poll_id | poll_id | 8 | live-cs.T.id,const | 1 | |
    +—-+————-+——-+——–+——————————-+———–+———+—————————+——+———————————+
    все умрут, а я изумруд
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 24 ноября 2009 г. 16:24, спустя 2 минуты 33 секунды

    надо проверить индексы на таблице B

    слушай, а этот запрос полторы секунды выполняется? строк то немного возвращается и на сортировку не похоже
    Сапожник без сапог
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 24 ноября 2009 г. 16:26, спустя 2 минуты 49 секунд

    USE INDEX()
    http://dev.mysql.com/doc/refman/5.1/en/index-hints.html
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 18 декабря 2009 г. 15:40, спустя 23 дня 23 часа 13 минут

    пидары :(
    все умрут, а я изумруд
  • Baboot

    Сообщения: 440 Репутация: N Группа: Адекваты

    Spritz 18 декабря 2009 г. 17:31, спустя 1 час 50 минут 39 секунд

    ))))))))))))))))))))))))))))))))))))
  • Cossack

    Сообщения: 17 Репутация: N Группа: Кто попало

    Spritz 18 августа 2012 г. 20:54, спустя 974 дня 2 часа 23 минуты

    во сколько лет тебя впервые изнасиловали?

Пожалуйста, авторизуйтесь, чтобы написать комментарий!