MySQL插入与锁表写

时间:2014-07-01 13:47:29

标签: mysql insert locking

任务是上传一份价格清单,所以在我实施之前快速提问。

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

  

“如果你做了很多连续的插入,你可以做一个LOCK TABLES,然后偶尔用一个UNLOCK TABLES(每1000行左右),以允许其他线程访问表。这仍然会带来不错的性能增益“。

显然,当我在桌子上有“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)

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

1 个答案:

答案 0 :(得分:0)

如果使用LOCK TABLES ... WRITE锁定表,则其他线程无法读取/写入该表。

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

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

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

如果表格插入到表格中间某处的空白区域,则会锁定该表格。如果您只对该表执行插入(无删除),则应该可以插入并选择多个线程。

如果表经常删除/更新,您应该考虑切换到InnoDB。

至于“由于某种原因没有添加任何行” - 你的语句/代码中几乎肯定会出现错误。该语句将插入行或返回错误。