Подзапрос, дистинкт, джоины, нечёткий поиск с %%, сортировка по выражению, лимит - да это самая худшая ситуация, которую можно представить для реляционной субд.
Ускорить запрос = сделать индексы. Как вы вообще проектируете БД, не зная про индексы? Идите читайте.
Любой вопрос про оптимизацию запроса должен включать в себя вывод результата двух запросов:
SHOW CREATE TABLE <tablename>; -- или его аналоги для вашей СУБД
Вы к лайкам делаете LEFT JOIN постов?) По логике у поста может не быть лайков, поэтому нужно к постам делать LEFT JOIN лайков. И зачем вы в WHERE дублируете условие по которому уже сделали JOIN?
Вам, молодой человек, потратить бы 15 минут на прочтение хотя бы одной статьи про JOIN в РБД, гораздо полезнее было бы, чем на тостере вопросы писать.
Делаете вторую тестовуюб базу, при входе как гость подключаетесь к ней, а не к рабочей.
Каждые 30 минут просто копируете всё с рабочей базы на тестовую.
Зачем менять шило на мыло? Попробуйте поставить hash индекс в базе и разогрейте её, тогда данные будут лежать в памяти и скорость доступа O(1), то есть не хуже вашего Node.JS и редиса.
mysql> show variables like 'have_innodb';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_innodb | YES |
+---------------+-------+
1 row in set (0.00 sec)
Зачем выбрали MyISAM если у вас почти всегда запись а не чтение?
Ну вообще по хорошему да, ON DUPLICATE KEY UPDATE, т.к. один запрос явно лучше, чем два (update + insert)
Профилирвщик вам чётко говорит, что он почти всё время копирует данные во временную таблицу, которая ещё и скидывается на диск - вдвойне нехорошо.
Не разбирался с индексами, но очевидно нехорошо делать такие большие оффсеты для лимита, почему - написано тут: explainextended.com/2009/10/23/mysql-order-by-limi...