November 21st, 2020

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 комментариев от некого момента во времени, но к каждому нужна бы дополнительная информация из других таблиц. Поэтому пытается подсосать информацию о заметке, к которой комментарий относится (известен номер заметки), а также информацию об авторе комментария (известен его номер, хотя в базе может не оказаться). Все мыслимые индексы есть для всех таблиц.
Collapse )