lleo (lleo) wrote,
lleo
lleo

Category:

Mysql задолбало

это перепост заметки, оригинал находится на моем сайте: https://lleo.me/dnevnik/2020/11/21

Сервер lleo.me время от времени подтормаживает, в основном из-за Mysql. Я уже чинил всякие запросы, индексы. Вчера я страницу https://lleo.me/dnevnik/comm сильно доработал по вашим просьбам, теперь там видно, на чей коммент кто отвечал, а если на ваш, то еще и красным показывает. При этом заметил: если нажимаю ссылку «предыдущие комменты», то сервер подвисает в половине случаев уж точно. Стал разбираться и увидел сложную конструкцию. Ну, как сложную... Сильно упрощая, выглядит так:

SELECT c.*,u.*,z.*
FROM `comments` AS c
JOIN `publications` AS z ON c.`num`=z.`num`
LEFT JOIN `users` AS u ON c.`user`=u.`user`
WHERE 1 AND c.`Time`<'1605909120' ORDER BY c.`Time` DESC LIMIT 50


Логика проста: движок берет 50 комментариев от некого момента во времени, но к каждому нужна бы дополнительная информация из других таблиц. Поэтому пытается подсосать информацию о заметке, к которой комментарий относится (известен номер заметки), а также информацию об авторе комментария (известен его номер, хотя в базе может не оказаться). Все мыслимые индексы есть для всех таблиц.

Не понимаю, почему Mysql с этим нехитрым на мой взгляд вопросом так туго справляется. Короче, я психанул и сделал вместо этой конструкции просто три разных запроса. Сперва вынимаю 50 комментариев, затем информацию об их заметках (обычно 50 комментариев относятся к двум последним заметкам), затем инфо об авторах (авторов тоже раза в четыре меньше, чем комментариев). И внезапно тормозить перестало! Либо я был неверного мнения о способностях Mysql оптимизировать запросы, либо запрос был как-то совсем неверно написан с точки зрения Mysql, и выполнять оно начинало его с другого конца, производя миллиард обратных сравнений по дате комментария. Сейчас я и процедуру комментов под заметкой так же переделал — там, правда, стыковались не все три базы, а всего две (информация о заметке и так известна), и работа выполнялась не с каждым посетителем, а густо кэшировалась в memcache (в отличие от страницы /comm, изначально предполагалось, что я туда хожу один). В общем, тоже сделал два запроса.

Если будут глюки — пишите lleo@lleo.me



это перепост заметки, оригинал находится на моем сайте: https://lleo.me/dnevnik/2020/11/21
Subscribe

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 3 comments