Есть, значит, табличка - там 2М+ записей (приростают), есть N объектов, для каждого из которых состояния по каждой записи может быть 0, 1 или 2.
Из большой таблицы делаются
select * from items where status=0 order by rand() limit 500, после чего по некоторым записям статус для одного из объектов меняется с 0 (дефолтно - 0), на что-то другое. И при следующем селекте для этого объекта данная запись должна будет быть исключена.
Решение 1:
Ввести в большую таблицу поле obj_ids, где вписывать id объектов, поюзавших запись, а в тот селект добавить лайк.
Решение 2:
Для каждого объекта вести отдельно свою таблицу
Решение 3:
Таблица objID_itemID - хранить кейвалью, короче. Но тогда селекты из большой километровыми станут из за not in (......)
++++++++++++++++++++++++++++++++++