22.6.4 Разбиение и блокировки
Для движков хранения, таких как MyISAM, которые на самом деле выполняют блокировки таблиц при выполнении операторов DML или DDL, такой оператор в более старых версиях MySQL (5.6.5 и ранее), который затрагивал разбиение таблиц, накладывал блокировку на всю таблицу; то есть, все разделы блокировались до завершения оператора. В MySQL 5.7, обрезка блокировок разделов устраняет ненужные блокировки во многих случаях, и большинство операторов чтения или обновления разбиений MyISAM таблицы блокируют только затронутые разделы. Например, оператор SELECT из разбиеной MyISAM таблицы блокирует только те разделы, которые фактически содержат строки, удовлетворяющие условию оператора SELECT.
Для операторов, влияющих на разбиение таблиц, использующих движки хранения, такие как InnoDB, которые используют блокировку на уровне строк и фактически не выполняют (или не нуждаются в выполнении) блокировок до обрезки разделов, это не проблема.
В следующих нескольких абзацах обсуждаются последствия обрезки блокировок разделов для различных операторов MySQL на таблицах, использующих движки хранения, которые используют блокировки на уровне таблиц.
Влияние на операторы DML
Операторы SELECT (включая те, которые содержат объединения или соединения) блокируют только те разделы, которые фактически нужно прочитать. Это также относится к SELECT ... PARTITION.
Оператор UPDATE обрезает блокировки только для таблиц, в которых столбцы разбиения не обновляются.
Операторы REPLACE и INSERT блокируют только те разделы, в которых есть строки для вставки или замены. Однако, если для любого столбца разбиения генерируется значение AUTO_INCREMENT, то блокируются все разделы.
Оператор INSERT ...
ON DUPLICATE KEY UPDATE обрезается, если ни один столбец разбиения не обновляется.
Оператор INSERT ...
SELECT блокирует только те разделы в исходной таблице, которые необходимо прочитать, хотя все разделы в целевой таблице блокируются.
Наложенные оператором LOAD DATA блокировки на разбиение таблиц не могут быть обрезаны.
Наличие BEFORE INSERT или BEFORE UPDATE триггеров, использующих любой столбец разбиения разбиеной таблицы, означает, что блокировки на INSERT и UPDATE операторах, обновляющих эту таблицу, не могут быть обрезаны, поскольку триггер может изменить их значения: Триггер BEFORE INSERT на любом из столбцов разбиения таблицы означает, что блокировки, установленные операторами INSERT или REPLACE, не могут быть обрезаны, поскольку триггер BEFORE INSERT может изменить столбцы разбиения строки до вставки строки, что заставит строку попасть в другой раздел, чем это было бы в противном случае. Триггер BEFORE UPDATE по столбцу разбиения означает, что наложенные операторами UPDATE или INSERT ... ON DUPLICATE KEY UPDATE блокировки не могут быть обрезаны.
Затронутые операторы DDL
Оператор CREATE VIEW не приводит к блокировкам.
Оператор ALTER
TABLE ... EXCHANGE PARTITION обрезает блокировки; блокируются только обмененная таблица и обмененный раздел.
Оператор ALTER
TABLE ... TRUNCATE PARTITION обрезает блокировки; блокируются только разделы, которые будут очищены.
Кроме того, операторы ALTER TABLE принимают блокировки метаданных на уровне таблицы.
Другие операторы
Оператор LOCK TABLES не может обрезать блокировки разделов.
Оператор CALL
stored_procedure( поддерживает обрезку блокировок, но вычисление expr)expr не поддерживает.
Операторы DO и SET не поддерживают обрезку блокировок разделов.
© 2025 Oracle
Licensed under the GPLv2 License.