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

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

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

Это изменение в поведении не оказывает влияния на операторы, производящие разделенные таблицы, используя механизмы хранения такой как InnoDB, та работа блокировка на уровне строки и фактически не выполняет (или должен выполнить), блокировки до сокращения раздела.

Следующие немного абзацев обсуждают эффекты сокращения блокировки раздела для различных операторов MySQL на таблицах, используя механизмы хранения, которые используют блокировки на уровне таблицы.

Влияет на операторах DML

SELECT операторы (включая тех, которые содержат объединения или соединения) теперь, блокируют только те разделы, которые фактически должны быть считаны. Это также применяется к SELECT ... PARTITION.

UPDATE сокращает блокировки только для таблиц, на которых не обновляются никакие столбцы разделения.

REPLACE и INSERT теперь заблокируйте только те разделы, имеющие строки, которые будут вставлены или заменены. Однако, если AUTO_INCREMENT значение сгенерировано для любого столбца разделения тогда, все разделы блокируются.

INSERT ... ON DUPLICATE KEY UPDATE сокращается, пока никакой столбец разделения не обновляется.

INSERT ... SELECT теперь блокировки только те разделы в исходной таблице, которая должна быть считана, хотя все разделы в целевой таблице блокируются.

Отметить

INSERT DELAYED не поддерживается для разделенных таблиц.

Блокировки, наложенные 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 операторы не поддерживают сокращение блокировки разделения.