【问题标题】:Deleting rows cause lock timeout删除行导致锁超时
【发布时间】:2010-12-24 00:22:18
【问题描述】:

尝试从表中删除行时,我不断收到这些错误。这里的特殊情况是我可能同时运行 5 个进程。

该表本身是一个包含约 450 万行的 Innodb 表。我的 WHERE 子句中使用的列没有索引。其他索引按预期工作。

这是在事务中完成的,首先我删除记录,然后插入替换记录,并且只有在插入所有记录时才提交事务。

错误信息:

查询错误:超过锁定等待超时;尝试在执行 DELETE FROM tablename WHERE column=value 时重新启动事务

在此处为引用的列创建索引会有所帮助吗?我应该明确锁定行吗?

我在#64653 中找到了一些有问题的额外信息,但我认为它不能完全涵盖我的情况。

确定是 DELETE 语句导致了错误,还是查询中的其他语句? DELETE 语句是第一个语句,因此看起来合乎逻辑,但我不确定。

【问题讨论】:

    标签: mysql locking delete-row


    【解决方案1】:

    索引肯定会有所帮助。如果您尝试替换已删除的记录,我建议您修改查询以使用更新而不是 DELETE 后跟 INSERT,如果可能的话:

    INSERT INTO tableName SET
    column2 = 'value2'
    WHERE column = value
    ON DUPLICATE KEY UPDATE
    column2 = 'value2'
    

    【讨论】:

    • 无法进行更新。替换记录可能更少/更多。索引有什么帮助?减少执行时间,进而降低发生锁超时的概率?
    • 啊,我明白了。您在减少执行时间方面做得很好。有 450 万行我猜你遇到了一些缓慢的查询。尝试根据您的一个列 ID 运行示例选择语句,以查看在没有索引的情况下检索记录的速度有多慢。然后返回并添加一个索引并将其用于比较。如果该列是一个相当大的 CHAR/VARCHAR,您可以通过仅使用字段的一小部分作为索引来减少一些开销,即 CREATE INDEX partial_idx ON tableName (column(10)) 仅使用前 10 个字符作为索引值。
    【解决方案2】:

    索引肯定有帮助。我曾经在一个包含用户数据的数据库上工作。 Web 前端和用户删除有时会出现问题。白天它工作得很好(虽然花了很长时间)。但是在下午晚些时候它有时会超时,因为数据库服务器由于一天结束的处理而承受更多的负载。 在受影响的列上敲击一个索引,然后一切都从那里顺利运行。

    【讨论】:

    • 是的,在我的例子中,是并行化导致了这个错误的发生。运行单个实例时,它从来都不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多