任务是上传一份价格清单,所以在我实施之前快速提问。
如果我想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)
但这通常会导致由于某种原因没有添加任何行。
答案 0 :(得分:0)
如果使用LOCK TABLES ... WRITE
锁定表,则其他线程无法读取/写入该表。
最好的方法是使用多行插入语句
INSERT INTO table (f1,f2,f3....) VALUES
(v1,v2,v3...),
(v1,v2,v3...),
...
您可能需要将行拆分为多个语句,每个语句包含1-10K行(可能更多,具体取决于您的max_packet_size和其他设置)。
如果表格插入到表格中间某处的空白区域,则会锁定该表格。如果您只对该表执行插入(无删除),则应该可以插入并选择多个线程。
如果表经常删除/更新,您应该考虑切换到InnoDB。
至于“由于某种原因没有添加任何行” - 你的语句/代码中几乎肯定会出现错误。该语句将插入行或返回错误。