语境:
有一个包含 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。问题仍然存在。
由于它是一个繁忙的表,我不想优化表,但如果这是答案 - 我想知道为什么。