Влияют ли заблокированные таблицы MySQL на связанные представления?

Итак, после прочтения " Производительность в PDO / PHP / MySQL: транзакции и прямое выполнение" в отношении проблем с производительностью, о которых я думал, я провел некоторое исследование по блокировке таблиц в MySQL.

На http://dev.mysql.com/doc/refman/5.0/en/table-locking.html

Блокировка таблицы позволяет многим сеансам читать из таблицы одновременно, но если сеанс хочет записать в таблицу, он должен сначала получить монопольный доступ. Во время обновления все другие сеансы, которые хотят получить доступ к этой конкретной таблице, должны ждать, пока обновление не будет выполнено.

Эта часть меня особенно поразила, потому что большинство наших запросов будут обновлениями, а не вставками. Мне было интересно, если кто-то создал таблицу с именем foo, для которой были выполнены все обновления / вставки, а затем представление с именем foo_view (копия foo, или, возможно, foo и связь нескольких других таблиц плюс foo), в которой происходили все выборки, Будет ли эта проблема блокировки все еще возникать?

То есть запросы SELECT для foo_view все еще должны ждать завершения обновления для foo?

Еще один короткий вопрос, который задал мой коллега. Влияет ли это на кеширование? Т.е., если SELECT будет кэширован, попадет ли он в кеш и вернет ли результаты или будет ждать, пока блокировка завершится первой?

1 ответ

Решение

Ваше представление будет испытывать ту же блокировку, что и базовые таблицы.

Со справочной страницы MySQL о блокировке:

MySQL предоставляет таблицы блокировки записи следующим образом:

  1. Если на столе нет замков, установите для него блокировку записи.
  2. В противном случае поместите запрос на блокировку в очередь блокировки записи.

MySQL предоставляет блокировку чтения таблицы следующим образом:

  1. Если на столе нет блокировок записи, установите на нее блокировку чтения.
  2. В противном случае поместите запрос блокировки в очередь блокировки чтения.

Стоит отметить, что это зависит от используемого вами механизма базы данных. MyISAM выполнит действия, описанные выше, и заблокирует всю таблицу (даже если она разбита на несколько разделов), где механизм, такой как InnoDB, вместо этого будет выполнять блокировку на уровне строк.

Если вы не достигли необходимых эталонов производительности с MyISAM и показали, что ваше узкое место ожидает блокировок таблицы через обновления, я бы предложил изменить механизм хранения вашей таблицы на InnoDB.

Другие вопросы по тегам