Пользователь по сложному условию ищет, например, товары. Каждый раз нужно выводить товар, которые он еще не видел. Для этого ведется таблица, в которой записываются, какие товары уже были показаны. Получается примерно такой запрос.
SELECT `item_id`, ... FROM `items_table` AS t1
WHERE [сложное условие для поиска]
AND t1.`item_id` NOT IN
( SELECT t2.`shown_id` FROM `shown_table` AS t2 WHERE t2.`user_id`=$user_id )
LIMIT 1;
После показа добавляем запись о просмотре
INSERT INTO `shown_table` ( `user_id`, `shown_id` ) VALUES ( $user_id, $shown_id );
Задумался о проверке условия NOT IN. Если просмотренных товаров будет много, то надо будет пробегать и проверять большой набор чисел. Можно ли как-то создать временные индексы для результатов промежуточного SELECT или MySQL сама все это оптимизирует?