myisam установить блокировку таблицы даже при работе с запросом select? - PullRequest
4 голосов
/ 20 июня 2011

Я читаю книгу High Performance MySQL, там упоминается:

performing one query per table uses table locks more efficiently: the queries 
will lock the tables invididually and relatively briefly, instead of locking 
them all for a longer time.

MyISAM устанавливает блокировку таблицы, даже когда selecting что-то? может кто-нибудь объяснить немного?

Ответы [ 2 ]

11 голосов
/ 20 июня 2011

MyISAM имеет различные виды замков.Операция SELECT помещает READ LOCK на стол.Может быть несколько активных блокировок чтения в любой момент времени, если нет активных ЗАПИСЬ ЗАМКОВ .Операции, которые изменяют таблицу, например.INSERT, UPDATE, DELETE или ALTER TABLE поместите ЗАПИСЬ ЗАПИСИ на стол.Блокировка записи может быть размещена только на столе, когда нет активных блокировок чтения;Если есть активные блокировки чтения, MyISAM ставит в очередь блокировку записи, которая будет активирована, как только истечет срок действия всех активных блокировок чтения.

Аналогично, когда есть активная блокировка чтения, попытка установить блокировку чтения на таблицу будет поставлена ​​в очередь.блокировка (и связанный запрос) до истечения срока действия блокировки записи в таблице.

В конечном итоге все это означает, что:

  • Вы можете иметь любое количество активных блокировок чтения (также называемыхобщие блокировки)
  • У вас может быть только одна активная блокировка записи (также называемая эксклюзивной блокировкой)

Для получения дополнительной информации см .: http://dev.mysql.com/doc/refman/5.5/en/internal-locking.html

1 голос
/ 21 июня 2011

reko_t предоставил хороший ответ, я постараюсь уточнить его:

Да.

  • У вас может быть ЛИБО один писатель или несколько читателей
  • Кромесуществует особый случай, называемый одновременных вставок .Это означает, что у вас может быть один поток, выполняющий вставку, в то время как один или несколько потоков выполняют запросы выбора (чтения).
    • Есть много предостережений, делающих это:
    • это должно быть "в конце" таблицы, а не в "дыре" в середине
    • Тольковставки могут выполняться одновременно (без обновлений, удалений)
  • Все еще существует конфликт по поводу одного буфера ключа MyISAM.Существует один ключевой буфер, защищенный одним мьютексом, для всего сервера.Все, что использует индекс, должно принимать его (обычно несколько раз).

По сути, MyISAM имеет плохой параллелизм.Вы можете попытаться подделать это, но это плохо, как бы вы на это ни смотрели.MySQL / Oracle в последнее время не предпринимали попыток улучшить его (глядя на исходный код, я не удивлен - они будут содержать только ошибки).

Если у вас есть рабочая нагрузка с большим количеством «больших» SELECTкоторые извлекают много строк или в некотором роде являются сложными, они могут часто перекрываться, это может показаться нормальным.Но одно обновление или удаление строки заблокирует их целую партию.

...