在处理一些 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
类型为 MEMORY
其他问题(例如查询 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
DB 以在所有表上获得一致的位置。