【问题标题】:How to order a composite index to prevent insertion deadlocks?如何订购复合索引以防止插入死锁?
【发布时间】:2017-09-15 14:38:17
【问题描述】:

我有一个mysql(实际上是MariaDB 5.5.52)数据库,大致描述如下:

CREATE TABLE table1 (
    id INT NOT NULL AUTOINCREMENT, 
    col1 INT, 
    col2 VARCHAR(32), 
    col3 VARCAHR(128), 
    PRIMARY KEY (ID), 
    UNIQUE KEY index1 (col1, col2, col3)
);

列比较多,但都在UNIQUE键里面,表中没有其他键。

我运行插入此数据库的 python 脚本的多个线程。每个线程使用 mysql.connector 的 executemany 进行大约 100-1000 次插入,例如

ins_string = "INSERT IGNORE INTO table1 ({0}) VALUES ({1});"
cursor.executemany(ins_string.format(fields, string_symbols), values)

我遇到了一致的死锁问题。我认为这些问题是由于每个线程根据我的python列表values的生成顺序以某种半随机顺序锁定table1的行之间造成的。这在一定程度上通过测试得到了验证;当我使用 24 个线程从头开始构建一个新数据库时,每个 executemany() 语句的死锁率 > 80%,但是当数据库中有超过一百万行时,死锁率接近于零。

我曾考虑过死锁是线程竞争 AUTOINCREMENT 的结果,但在默认的 InnoDB 'consecutive' 锁定模式下,这似乎不应该发生。每个线程都应该得到一个table level lock,直到插入结束。但是,AUTOINCREMENT 和 INSERT 锁的交互方式让我感到困惑,所以如果我有这个错误,请告诉我。

因此,如果问题是由唯一键的随机排序引起的,我需要某种方式在 python 中对插入语句进行排序,然后再将它们传递给 MySql。索引由 MySql 以某种方式散列,然后排序。如何在 python 中复制散列/排序?

我在这里询问我对问题的诊断的解决方案,但如果您发现我的诊断有误,请再次告诉我。

【问题讨论】:

    标签: python mysql mariadb innodb


    【解决方案1】:

    为什么有ID,因为你有一个UNIQUE 可以提升为PRIMARY 的密钥?

    无论如何,在构建executemany 之前,对(col1, col2, col3) 上的批量插入行进行排序。

    如果这还不够,则减少每个executemany 中的行数。 100 行在理论最佳值的 10% 以内。如果 100 将死锁频率降低到以下,比如 10%,那么您可能非常接近批量加载速度和重放死锁导致的减速之间的最佳平衡。

    你有多少个 CPU 内核?

    还有其他索引您没有向我们展示吗? Every UNIQUE 索引因素导致了这个问题。非唯一索引不是问题。请提供完整的SHOW CREATE TABLE

    【讨论】:

    • 共有八列,全部在UNIQUE索引中;否则就是完整的CREATE TABLE 声明。 id 列作为各种子表的外键存在。我运行的线程数从来没有超过我拥有的 CPU 内核数,通常我在 48 核服务器上,同时限制为 24 个或更少线程(还有其他进程正在进行)。
    • @kingledion -- 好的;这些答案似乎是合理的。因此,我投票赞成 (1) 为 executemany 和 (2) 小批量预排序行。少于 24 个线程可能有助于在一定程度上避免死锁,但完成的工作更少——无法预测是否值得做。什么版本的MySQL?旧版本在 24 个线程时效率低下。
    • 它是 MariaDB 5.5.52。我想我应该提到它是 MariaDB……什么是“旧”版本?
    • MariaDB 5.5 和 MySQL 5.5 非常接近。我不记得了,但似乎 16 线程会更安全。 5.7 (10.2) 是 48 变得可行的时候。
    猜你喜欢
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多