SychO Here is the SQL from Mysql slow log.
( SELECT
`discussions`.*
FROM
`discussions`
WHERE
(
`discussions`.`id` NOT IN (
SELECT
`discussion_id`
FROM
`discussion_tag`
WHERE
`tag_id` NOT IN (
SELECT DISTINCT
`tags`.`id`
FROM
`tags`
INNER JOIN `discussion_tag` ON `tags`.`id` = `discussion_tag`.`tag_id`
INNER JOIN `discussions` ON `discussion_tag`.`discussion_id` = `discussions`.`id`
INNER JOIN `tags` AS `perm_tags` ON `tags`.`id` = `perm_tags`.`id`
OR `tags`.`parent_id` = `perm_tags`.`id`
AND (
`perm_tags`.`is_restricted` = 1
AND `perm_tags`.`id` IN ( '13', '27' ))
OR `perm_tags`.`is_restricted` = 0
)))
AND (
`discussions`.`is_private` = 0
OR (((
`discussions`.`is_approved` = 0
AND (
`discussions`.`user_id` = 2925
OR ((
`discussions`.`id` NOT IN (
SELECT
`discussion_id`
FROM
`discussion_tag`
WHERE
`tag_id` NOT IN (
SELECT DISTINCT
`tags`.`id`
FROM
`tags`
INNER JOIN `discussion_tag` ON `tags`.`id` = `discussion_tag`.`tag_id`
INNER JOIN `discussions` ON `discussion_tag`.`discussion_id` = `discussions`.`id`
INNER JOIN `tags` AS `perm_tags` ON `tags`.`id` = `perm_tags`.`id`
OR `tags`.`parent_id` = `perm_tags`.`id`
AND ( `perm_tags`.`is_restricted` = 1 AND 0 = 1 ))))
AND EXISTS ( SELECT * FROM `tags` INNER JOIN `discussion_tag` ON `tags`.`id` = `discussion_tag`.`tag_id` WHERE `discussions`.`id` = `discussion_tag`.`discussion_id` )))))))
AND (
`discussions`.`hidden_at` IS NULL
OR `discussions`.`user_id` = 2925
OR ((
`discussions`.`id` NOT IN (
SELECT
`discussion_id`
FROM
`discussion_tag`
WHERE
`tag_id` NOT IN (
SELECT DISTINCT
`tags`.`id`
FROM
`tags`
INNER JOIN `discussion_tag` ON `tags`.`id` = `discussion_tag`.`tag_id`
INNER JOIN `discussions` ON `discussion_tag`.`discussion_id` = `discussions`.`id`
INNER JOIN `tags` AS `perm_tags` ON `tags`.`id` = `perm_tags`.`id`
OR `tags`.`parent_id` = `perm_tags`.`id`
AND ( `perm_tags`.`is_restricted` = 1 AND 0 = 1 ))))
AND EXISTS ( SELECT * FROM `tags` INNER JOIN `discussion_tag` ON `tags`.`id` = `discussion_tag`.`tag_id` WHERE `discussions`.`id` = `discussion_tag`.`discussion_id` )))
AND (
`discussions`.`comment_count` > 0
OR `discussions`.`user_id` = 2925
OR ((
`discussions`.`id` NOT IN (
SELECT
`discussion_id`
FROM
`discussion_tag`
WHERE
`tag_id` NOT IN (
SELECT DISTINCT
`tags`.`id`
FROM
`tags`
INNER JOIN `discussion_tag` ON `tags`.`id` = `discussion_tag`.`tag_id`
INNER JOIN `discussions` ON `discussion_tag`.`discussion_id` = `discussions`.`id`
INNER JOIN `tags` AS `perm_tags` ON `tags`.`id` = `perm_tags`.`id`
OR `tags`.`parent_id` = `perm_tags`.`id`
AND ( `perm_tags`.`is_restricted` = 1 AND 0 = 1 ))))
AND EXISTS ( SELECT * FROM `tags` INNER JOIN `discussion_tag` ON `tags`.`id` = `discussion_tag`.`tag_id` WHERE `discussions`.`id` = `discussion_tag`.`discussion_id` )))
AND NOT EXISTS ( SELECT 1 FROM `discussion_user` WHERE `discussions`.`id` = `discussion_id` AND `user_id` = 2925 AND `subscription` = 'ignore' )
AND `discussions`.`id` NOT IN (
SELECT
`discussion_id`
FROM
`discussion_tag`
WHERE
`tag_id` IN ( SELECT `tag_id` FROM `tag_user` WHERE `user_id` = 2925 AND `subscription` = 'hide' ))
AND (
`discussions`.`id` NOT IN (
SELECT DISTINCT
`discussion_id`
FROM
`discussion_tag`
WHERE
`tag_id` IN ( 5, 27, 31 ))
OR (
`discussions`.`user_id` IN (
155,
614,
945,
1506,
2901,
3346,
4388,
463,
535,
1267,
1345,
1458,
1700,
2294,
2601,
3677,
3686,
3761,
3956,
4320,
4328,
4686,
7913,
8157,
8158,
9699,
9708,
9965,
10785
)))
ORDER BY
`last_posted_at` DESC
LIMIT 21
) UNION
(
SELECT
`discussions`.*
FROM
`discussions`
WHERE
(
`discussions`.`id` NOT IN (
SELECT
`discussion_id`
FROM
`discussion_tag`
WHERE
`tag_id` NOT IN (
SELECT DISTINCT
`tags`.`id`
FROM
`tags`
INNER JOIN `discussion_tag` ON `tags`.`id` = `discussion_tag`.`tag_id`
INNER JOIN `discussions` ON `discussion_tag`.`discussion_id` = `discussions`.`id`
INNER JOIN `tags` AS `perm_tags` ON `tags`.`id` = `perm_tags`.`id`
OR `tags`.`parent_id` = `perm_tags`.`id`
AND (
`perm_tags`.`is_restricted` = 1
AND `perm_tags`.`id` IN ( '13', '27' ))
OR `perm_tags`.`is_restricted` = 0
)))
AND (
`discussions`.`is_private` = 0
OR (((
`discussions`.`is_approved` = 0
AND (
`discussions`.`user_id` = 2925
OR ((
`discussions`.`id` NOT IN (
SELECT
`discussion_id`
FROM
`discussion_tag`
WHERE
`tag_id` NOT IN (
SELECT DISTINCT
`tags`.`id`
FROM
`tags`
INNER JOIN `discussion_tag` ON `tags`.`id` = `discussion_tag`.`tag_id`
INNER JOIN `discussions` ON `discussion_tag`.`discussion_id` = `discussions`.`id`
INNER JOIN `tags` AS `perm_tags` ON `tags`.`id` = `perm_tags`.`id`
OR `tags`.`parent_id` = `perm_tags`.`id`
AND ( `perm_tags`.`is_restricted` = 1 AND 0 = 1 ))))
AND EXISTS ( SELECT * FROM `tags` INNER JOIN `discussion_tag` ON `tags`.`id` = `discussion_tag`.`tag_id` WHERE `discussions`.`id` = `discussion_tag`.`discussion_id` )))))))
AND (
`discussions`.`hidden_at` IS NULL
OR `discussions`.`user_id` = 2925
OR ((
`discussions`.`id` NOT IN (
SELECT
`discussion_id`
FROM
`discussion_tag`
WHERE
`tag_id` NOT IN (
SELECT DISTINCT
`tags`.`id`
FROM
`tags`
INNER JOIN `discussion_tag` ON `tags`.`id` = `discussion_tag`.`tag_id`
INNER JOIN `discussions` ON `discussion_tag`.`discussion_id` = `discussions`.`id`
INNER JOIN `tags` AS `perm_tags` ON `tags`.`id` = `perm_tags`.`id`
OR `tags`.`parent_id` = `perm_tags`.`id`
AND ( `perm_tags`.`is_restricted` = 1 AND 0 = 1 ))))
AND EXISTS ( SELECT * FROM `tags` INNER JOIN `discussion_tag` ON `tags`.`id` = `discussion_tag`.`tag_id` WHERE `discussions`.`id` = `discussion_tag`.`discussion_id` )))
AND (
`discussions`.`comment_count` > 0
OR `discussions`.`user_id` = 2925
OR ((
`discussions`.`id` NOT IN (
SELECT
`discussion_id`
FROM
`discussion_tag`
WHERE
`tag_id` NOT IN (
SELECT DISTINCT
`tags`.`id`
FROM
`tags`
INNER JOIN `discussion_tag` ON `tags`.`id` = `discussion_tag`.`tag_id`
INNER JOIN `discussions` ON `discussion_tag`.`discussion_id` = `discussions`.`id`
INNER JOIN `tags` AS `perm_tags` ON `tags`.`id` = `perm_tags`.`id`
OR `tags`.`parent_id` = `perm_tags`.`id`
AND ( `perm_tags`.`is_restricted` = 1 AND 0 = 1 ))))
AND EXISTS ( SELECT * FROM `tags` INNER JOIN `discussion_tag` ON `tags`.`id` = `discussion_tag`.`tag_id` WHERE `discussions`.`id` = `discussion_tag`.`discussion_id` )))
AND NOT EXISTS ( SELECT 1 FROM `discussion_user` WHERE `discussions`.`id` = `discussion_id` AND `user_id` = 2925 AND `subscription` = 'ignore' )
AND `discussions`.`id` NOT IN (
SELECT
`discussion_id`
FROM
`discussion_tag`
WHERE
`tag_id` IN ( SELECT `tag_id` FROM `tag_user` WHERE `user_id` = 2925 AND `subscription` = 'hide' ))
AND (
`discussions`.`id` NOT IN (
SELECT DISTINCT
`discussion_id`
FROM
`discussion_tag`
WHERE
`tag_id` IN ( 5, 27, 31 ))
OR (
`discussions`.`user_id` IN (
155,
614,
945,
1506,
2901,
3346,
4388,
463,
535,
1267,
1345,
1458,
1700,
2294,
2601,
3677,
3686,
3761,
3956,
4320,
4328,
4686,
7913,
8157,
8158,
9699,
9708,
9965,
10785
)))
AND `is_sticky` = 1
LIMIT 21
)
ORDER BY
is_sticky
AND NOT EXISTS ( SELECT 1 FROM `discussion_user` AS `sticky` WHERE `sticky`.`discussion_id` = `id` AND `sticky`.`user_id` = 2925 AND `sticky`.`last_read_post_number` >= `last_post_number` )
AND last_posted_at > '2025-01-20 17:27:14' DESC,
`last_posted_at` DESC
LIMIT 21;
And here is the EXPLAIN

As you see, It's a big SQL with many NOT IN.