Использование алгоритма UPDATE с буфером
В этой статье объясняется алгоритм Использование буфера для оператора UPDATE.
Рассмотрим следующую таблицу и запрос:
| Имя | Зарплата |
|---|---|
| Babatunde | 1000 |
| Jolana | 1050 |
| Pankaja | 1300 |
UPDATE employees SET salary = salary+100 WHERE salary < 2000;
Предположим, что таблица employees имеет индекс по столбцу зарплата, и оптимизатор решил использовать сканирование диапазона по этому индексу.
Оптимизатор начинает сканирование диапазона по индексу зарплата. Мы находим первую запись Babatunde, 1000. Если мы выполним обновление "на лету", мы сразу же дадим указание хранилищу данных изменить эту запись на Babatunde, 1000+100=1100.
Затем мы продолжаем поиск следующей записи и находим Jolana, 1050. Мы даём указание хранилищу данных обновить её на Jolana, 1050+100=1150.
Затем мы продолжаем поиск следующей записи... и то, что происходит дальше, зависит от хранилища данных. В некоторых хранилищах данных изменения данных видны сразу, поэтому мы найдём запись Babatunde, 1100, которую мы записали на первом шаге, и изменим её ещё раз, дав Babatunde незаслуженную надбавку. Затем мы снова увидим Babatunde и так далее, в бесконечном цикле.
Чтобы предотвратить такие ситуации, оптимизатор проверяет, будет ли оператор UPDATE изменять значения ключей, которые он использует. В этом случае он будет использовать другой алгоритм:
- Просканировать всех, у кого "зарплата<2000", запомнив идентификаторы строк в буфере.
- Прочитать буфер и применить обновления.
Таким образом, каждая строка будет обновлена только один раз.
Вывод Using buffer EXPLAIN указывает, что будет использоваться описанный выше буфер.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/using-buffer-update-algorithm/