SELECT COUNT(`id`)
FROM `data`
WHERE `id` IN (
SELECT `id_data`
/ * JOIN несколько таблиц и т.п.*/
WHERE /* куча условий */
)
/* LIMIT 1000 */
Если проблема в том что мне надо перелопачивать миллионы записей с диска - ну как бы любая БД будет пыхтеть. То есть задача не должна быть - в выборе БД, а задача в том что бы он не 3 миллиона записей с диска тащил, а чуток поменьше
Стоит привести explain. Равно и какой порядок полей в составном индексе вы делали?
А почему одна сущность "категории" разбита по двум таблицам?
И оптимизация тут будет одна - отдельная таблица или вью (материализованное) которая пересчитывается или обновляется ровно под эти запросы. А пересчет изменений - там уж в зависимости от того как часто мы это дергаем - кроном, триггером.
Как делается?
Ответ: делается web-программистами.
Сколько времени?
Ответ: никто не скажет точно.