Какие условия вызывают блокировку уровня таблицы
Работая над некоторыми проблемами производительности vBulletin, я столкнулся с такой ситуацией, когда все застревает в ожидании блокировки на уровне таблицы:
Id Command Time State Info
83 Query 47 Writing to net SELECT /*!40001 SQL_NO_CACHE */ * FROM `post`
87 Query 117 Waiting for table level lock UPDATE session SET lastactivity = 1362132185, location = '/for
89 Query 116 Waiting for table level lock SELECT * FROM session WHERE userid = 0 AND host = '178.1
90 Query 113 Waiting for table level lock SELECT * FROM session WHERE userid = 0 AND host = '66.24
94 Query 108 Waiting for table level lock select userid from session where sessionhash = '2269de072969ab9d42
96 Query 102 Waiting for table level lock SELECT * FROM session WHERE sessionhash = 'b0e3d290e9f609160
129 Query 15 Waiting for table level lock SELECT * FROM session WHERE userid = 0 AND host = '65.55
130 Query 14 Waiting for table level lock SELECT * FROM session WHERE userid = 0 AND host = '71.19
132 Query 13 Waiting for table level lock SELECT * FROM session WHERE userid = 0 AND host = '178.1
Обычно шаблон для диагностики проблем с блокировкой состоит в том, чтобы выяснить, какой запрос не заблокирован, и, как правило, это ваш виновник. Но в этом случае он читает несвязанную таблицу, и запрос, который выполнялся дольше всего (что, безусловно, является частью проблемы, поскольку это единственный запрос на обновление), ТАКЖЕ заблокирован.
Таким образом, вопрос в том, какие дополнительные условия могут вызвать применение блокировки на уровне таблицы, что можно ожидать в ситуации, подобной приведенной здесь.
Добавить детали
Это примерно стандартная установка mysql; нет разделения или других махинаций
Таблица posts
это типа MyISAM
Таблица session
это типа ПАМЯТЬ
Другие вопросы (такие как вопиющая неэффективность запроса 83 или нецелесообразность использования MyISAM) интересны, но не то, что требуется.
Полный текст запроса 87 выглядит так:
Query UPDATE session SET lastactivity = 1362132185, location = '/forums/forumdisplay.php?f=421', inforum = 421, inthread = 0, incalendar = 0, badlocation = 0 WHERE sessionhash = 'e6322935fe2df18106878473f310d91f'
1 ответ
Mysqldump работает во время блокировки? Похоже, что поток 83 может быть в настоящее время экспортирует post
но, возможно, позвонил LOCK TABLES
на БД, чтобы получить согласованную позицию на всех столах.