【问题标题】:MySQL Insert with lock tables writeMySQL插入带锁表写入
【发布时间】:2014-07-01 13:47:28
【问题描述】:

任务是上传各种价目表,所以在我实施之前快速提问。

如果我想一次插入说 1000 行,比如 100,000 行,建议是: http://dev.mysql.com/doc/refman/5.5/en/optimizing-myisam-bulk-data-loading.html

“如果你做了很多连续的插入,你可以偶尔做一个 LOCK TABLES 后跟一个 UNLOCK TABLES(每 1,000 行左右)以允许其他线程访问表。这仍然会产生很好的性能收获。”

很明显,虽然我在桌子上有“WRITE LOCK”,但你仍然可以读取表格吗?

我问的原因是: http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html 说:

只有持有锁的会话才能访问表。在锁被释放之前,没有其他会话可以访问它

“可以访问它”...我的天哪,如果是这种情况,我们的整个系统就会冻结...我们根本无法拥有...这是事实,还是他们的意思是“。 ..在释放锁之前,没有其他会话可以写入表。”?

最终我希望能够在不影响系统的情况下插入 100,000 行简单的数据。我用过:

插入值 (1,0.00),(2,0.00), ... ..., (999,0.00)

但这通常会导致由于某种原因没有添加任何行。

【问题讨论】:

    标签: mysql insert locking


    【解决方案1】:

    如果您使用LOCK TABLES ... WRITE 锁定表,则没有其他线程可以读取/写入该表。

    最好的办法是使用多行插入语句

    INSERT INTO table (f1,f2,f3....) VALUES
    (v1,v2,v3...),
    (v1,v2,v3...),
    ...
    

    您可能需要将行拆分为多个语句,每个语句有 1-10K 行(可能更多取决于您的 max_packet_size 和其他设置)。

    如果 MyISAM 将表插入到表中间某处的空白区域,它会锁定该表。如果您只对该表进行插入(不删除),则应该可以使用多个线程插入和选择。

    如果表有频繁的删除/更新,你应该考虑切换到 InnoDB。

    至于“由于某种原因没有添加行”-几乎可以肯定您的语句/代码中的某处存在错误。该语句将插入行或返回错误。

    【讨论】:

    • 感谢您的信息。 BTW:“由于某种原因没有添加行”的问题仍然存在......它很奇怪。
    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    相关资源
    最近更新 更多