MySQL在dict0dict.cc上获取长信号量锁 - 但是在DML操作上

时间:2016-07-19 00:59:51

标签: mysql semaphore mysql-5.6 b-tree-index

上下文

有一个包含2列的表格 整数id列 - 主键自动增量 和一个长文本栏。

许多不同的进程和连接会同时从此表中添加,读取和删除行。根本没有DDL语句。只需插入,选择和删除 - 每个操作最多发生一行。即 插入单行,按主键选择单行,然后按主键删除单行。

该表是mysql实例上的唯一表(这是在docker容器中)。

该表的填充行很少,ibd文件的大小为199G。

问题

我经常看到像这样的信号量锁

--Thread 140441749952256 has waited at btr0cur.cc line 545 for 249.00 seconds the semaphore:
S-lock on RW-latch at 0x4fcb428 created in file dict0dict.cc line 2606
a writer (thread id 140441750218496) has reserved it in mode  exclusive
number of readers 0, waiters flag 1, lock_word: 0
Last time read locked in file btr0cur.cc line 545

有时锁定保持超过600秒且innodb故意崩溃。

在dict0dict中查看5.6.26 - the function的代码是

Adds an index to the dictionary cache.
@return DB_SUCCESS, DB_TOO_BIG_RECORD, or DB_CORRUPTION */
UNIV_INTERN
dberr_t
dict_index_add_to_cache(

具体而言:

rw_lock_create(index_tree_rw_lock_key, &new_index->lock,
               dict_index_is_ibuf(index)
               ? SYNC_IBUF_INDEX_TREE : SYNC_INDEX_TREE);

问题

造成这些锁的原因是什么?

目前已尝试

  • 看到它是b-tree游标和字典之间的争用 和一些研究,我关闭自适应哈希索引。问题仍然存在 持续存在。
  • 然后将缓冲池从默认的128M增加到1G。 问题仍然存在。

由于它是一张忙碌的桌子,我不想优化桌子,但如果是答案 - 我想知道原因。

0 个答案:

没有答案