Spec-Zone .ru
спецификации, руководства, описания, API

17.6.4. Разделение и Блокировка

Для механизмов хранения такой как MyISAM это фактически выполняет блокировки на уровне таблицы, выполняя DML или операторы DDL, такой оператор в более старых версиях MySQL (5.6.5 и ранее), который влиял на разделенную таблицу, наложенную блокировка на таблицу в целом; то есть, все разделы были заблокированы, пока оператор не был закончен. В MySQL 5.7 сокращение блокировки раздела устраняет ненужные блокировки во многих случаях, и большинство операторов, читающих из или обновляющих разделенный MyISAM табличная причина только произведенные разделы, которые будут заблокированы. Например, a SELECT от разделенного MyISAM блокировки таблицы только те разделы, фактически содержащие строки, которые удовлетворяют SELECT оператор WHERE условие блокируется.

Для операторов, производящих разделенные таблицы, используя механизмы хранения такой как 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 операторы, обновляющие эту таблицу, не могут быть сокращены, так как триггер может изменить свои значения: A BEFORE INSERT включите любое из средств столбцов разделения таблицы что блокировки, установленные INSERT или REPLACE не может быть сокращен, начиная с BEFORE INSERT триггер может изменить столбцы разделения строки прежде, чем строка будет вставлена, вызывая строку в различный раздел, чем это было бы иначе. A 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 операторы не поддерживают сокращение блокировки разделения.