Речь идет о поведении одновременного ВЫБРАТЬ и UPDATE в MySQL InnoDB таблице:MySQL MVCC (InnoDB)
У нас есть относительно большой стол, который мы периодически сканировать чтения нескольких полей, включая поле с именем, скажем, LastUpdate
. Во время сканирования мы обновляем ранее проверенные строки. Обновления группируются и выполняются в фоновом потоке - с использованием другого соединения. Важно отметить, что мы обновляем строки, которые уже были прочитаны.
Три вопроса:
- Will InnoDB будет сохранять предыдущие версии обновленных строк, так как SELECT, все еще продолжается?
- Будет ли использовать READ-UNCOMMITTED для справки SELECT?
- Как я могу подтвердить, что InnoDB сохраняет или не сохраняет предыдущие версии измененных строк в своем повторном журнале.
Не уверен, что я понимаю ответ. Оператор SELECT в моем случае потенциально возвращает * лот * строк (100 000 и более). Вопрос в том, могу ли я как-то сказать MySQL, что я закончил обработку первых 1000 строк, и нет необходимости хранить старые версии этих строк во время их обновления. – nimrodm
Возможно, единственный способ - разбить его на кусты. –
Ну, использование LIMIT/OFFSET очень неэффективно, и использование курсора выборки сервера заставляет MySQL создавать временную таблицу, что снова означает копирование всех данных. Возможно, разбивка на первичный ключ будет работать лучше всего. Благодаря! – nimrodm