2

语境:

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

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

该表是 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 故意崩溃。

查看 5.6.26 的代码 - dict0dict中的函数

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。问题仍然存在。

由于它是一个繁忙的表,我不想优化表,但如果这是答案 - 我想知道为什么。

4

0 回答 0