myisam установить блокировку таблицы даже при работе с запросом select?

Я читаю книгу 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 ответа

Решение

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

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

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

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

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

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

Да.

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

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

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

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