Я не знаю ни одного стандартного способа сделать это, но мы решили подобную проблему раньше, используя две таблицы, Processing
и Done
в вашем случае, первая с индексом, вторая без.
Предполагая, что строки никогда не переключаются обратно с done
на processing
, вот шаги, которые вы можете использовать:
- Когда вы создаете запись, вставьте ее в таблицу
Processing
со столбцом, установленным в processing
.
- По окончании установите для столбца значение
done
.
- Периодически сканируйте таблицу
Processing
, перемещая строки done
в таблицу Done
.
Последний может быть хитрым. Вы можете сделать вставку / удаление в транзакции, чтобы убедиться, что она переносится правильно, или вы можете использовать уникальный идентификатор, чтобы обнаружить, если он уже передан, а затем просто удалить его из Processing
(у меня нет опыта поддержки транзакций MySQL, поэтому тоже даю такую опцию).
Таким образом, вы индексируете только несколько из 99,9% строк done
, которые еще не были перенесены в таблицу Done
. Он также будет работать с несколькими состояниями processing
, как вы упомянули в комментариях (записи переносятся только тогда, когда они достигают состояния done
, все остальные состояния остаются в таблице Processing
).
Это похоже на перенос исторических данных (которые больше никогда не изменятся) для эффективности в отдельную таблицу. Это может усложнить некоторые запросы, когда вам нужен доступ как к done
, так и к не done
строкам, так как вам нужно объединить две таблицы, поэтому помните, что есть компромисс.