{imgicourl}{zamok}
<< предыдущая заметкаследующая заметка >>
21 ноября 2020
Mysql задолбало

Сервер 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

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок
Оставить комментарий

рекламная лирика