Запросик-то простой. Прежде чем вывести заданную страницу темы, нужно получить список всех видимых постов. Ошибка изначально была в архитектуре. Поэтому дыру в голове не заткнешь, индексы не построишь и запрос не перепишешь.
SELECT post.postid, post.visible, post.userid, post.attach
FROM post AS post
WHERE post.threadid = 35
AND post.visible IN (1
,2
,0
)
OR (post.threadid = 35 AND post.visible=0 AND post.userid="1")
ORDER BY post.dateline