Сам индекс может иметь обе записи, которые можно удалить перед возвратом. Так что в этом случае одно только ondex не может быть использовано для получения записей (MVCC сделан PostGres). InnoDB / Oracle хранит только одну версию данных / индекса и, используя раздел отмены, перестраивает более старые версии для более старых транзакций.
У вас не будет слишком много копий, когда БД используется в целом, так как периодически копии будут собираться мусором (в PostGres), а Oracle / InnoDB будет иметь разделы отмены, которые будут повторно использоваться при отмене / подтверждении транзакции. Если у вас слишком много длительных транзакций, очевидно, у вас будут проблемы.
Индексы предназначены для ускорения доступа, более быстрого поиска записи, без касания всех из них. Индекс не обязательно должен быть точным при первом проходе, вам может понадобиться посмотреть на кортеж, чтобы убедиться, что он действителен в одной конкретной транзакции или нет (как в PostGres). Индекс racle или InnoDB даже является версионным, поэтому вы можете получать данные из самих индексов.
Прочтите это , чтобы получить подробное представление о двух способах реализации MVCC (PresGres и Oracle / InnoDB).
InnoDB MVCC и комментарии здесь также полезны
PS: я не специалист по внутренним mysql / oracle / postgres, все еще учусь, как все работает.