так а где индексы-то?
Я MySQL не знаю, но возможно есть опция посмотреть не результат запроса, а так называемый PLAN, там написан весь порядок - что перебираем, с чем джойним по какому индексу, как отбираем... перебор без индекса напишет типа raw что-нибудь. Индексы бывают разные, в оптимизированной базе одно поле может быть в нескольких индексах, нужно выбирать по юникам/фильтрам/статистике.
13М запросов лучше вообще без SQL делать, а на прямых ссылках, тогда хоть триллион т.к. она вообще ничего не ищет т.к. ничего не теряет.
Нужно знать сами индексы, структуру базы, ее наполнение, статистику значений, повадки оптимизатора. В MySQ эти IF скорее всего оптимизатору не понятны и будут перебираться все записи, лучше
AND post.dateline > IF(threadread.readtime IS NULL , UNIX_TIMESTAMP() - (10*86400 ) , threadread.readtime)
расписать
AND (threadread.readtime IS NULL AND post.dateline > UNIX_TIMESTAMP() - (10*86400 )
OR post.dateline>threadread.readtime) - скобки расставь
тогда если null'ы проиндексированы и оптимизатор разбирает такие выражения, он всего два раза выполнит бинарный поиск, ну а что нужно перебирать его придется перебирать.
поищи слово PLAN в документации
Если база маленькая анализ запроса может выполняться дольше чем сам запрос. Тут куча нюансов, вообще DBA целая профессия, причем нужно знать конкретные сервер-базу-запросы, а не теории. И все равно иногда запросы летают, а добавили одну запись, дурной оптимизатор запросов подсуетился и запрос зависает на сутки.