Есть большое количество записей, у которых среди прочих полей есть, допустим, список меток, дата и статус. При работе с этими данными пользователь сначала фильтрует их по всем полям кроме даты и статуса. Фильтр может вернуть как мало записей, так и хоть все. После этого отфильтрованные данные должны быстро вытаскиваться по статусу и диапазону дат.
Проблема в том, что фильтр может быть очень сложный и долгий для исполнения (например, записи, которые содержат 20 меток, не содержат 20 других меток и содержат какое-то слово в названии), то есть совать его в каждый запрос нельзя. Соответственно, надо кэшировать список отфильтрованных записей, причем чтобы сам этот кэш был проиндексирован по дате/статусу для последующей выборки. Какие бы средства (БД) применить, чтобы это эффективно реализовать? SQL, NoSQL, мне в принципе все равно сейчас.
Похожий механизм есть в одной CMS, там при больших объемах много join, и вот по некоторым версиям, неплохо вопрос скорости решается выносом индексов в Sphinx, не знаю на сколько это поможет вам, но как вариант думаю стоит погуглить.
Постройте свои индексы по диапазонам значений с учетом своих знаний о распределениям ваших данных и возможных запросах, так что бы сразу отсекать по максимуму. Когда-то это очень помогло для поиска по всем жж пользователям размеченным множеством параметров.
Фильтр может вернуть как мало записей, так и хоть все. После этого отфильтрованные данные должны быстро вытаскиваться по статусу и диапазону дат.
Т.е. в любом случае пользователю возвращается некий ограниченный набор данных, верно? В таком случае можно начать с реляционки и грамотного индексирования.
Данные пользователю идут по частям. Первый случай — пользователь сказал, а дай мне все подряд записи с такими тегами, я буду их постранично просматривать. Второй случай — пользователь сказал, а дай мне записи с такими тегами, но сначала только с большим приоритетом, а потом я «отзумирую» вот этот промежуток времени посмотрю подробнее, подгрузи плавненько с приоритетом поменьше, а потом вот это место ещё подробнее и так далее.