Работая над некоторыми проблемами производительности 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'
Работает ли mysqldump во время блокировки? Похоже, поток 83 в настоящее время экспортирует post
но, возможно, позвонил LOCK TABLES
в БД, чтобы получить согласованную позицию по всем таблицам.