我要将数十万个元素插入到数据库中。我意识到每个元素调用一个insert语句太昂贵了,我需要减少开销。 我重新调整每个插入可以指定多个数据元素,如
INSERT INTO example (Parent, DataNameID) VALUES (1,1), (1,2)
我的问题是,因为“DataName”不断重复每个元素,我认为如果我将这些字符串名称存储在另一个表中并引用它,它会优化空间。 但是,这会导致我对批量插入的想法出现问题,现在需要一种方法来在调用批量插入之前从名称中实际评估ID。
有什么建议吗? 我是否应该简单地对数据进行反规范化并将数据作为普通字符串插入到表中? 还有什么是字符串大小的限制,因为字符串查询几乎达到1.2 MB?
我正在使用PHP与MySQL后端
答案 0 :(得分:1)
首先,您应该在表格中插入名称。
而不是致电LAST_INSERT_ID()
来获取身份证。
您可以进行正常插入。
如果您的表格基于MYisam
,则可以使用INSERT DELAYED
来提高效果:http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html
答案 1 :(得分:1)
您没有向我们提供有关数据库结构或大小的大量信息,但这可能是绝对标准化不值得麻烦的情况。
但是如果你想让它保持标准化并且字符串已经在你的另一个表中(我们称之为datanames
),你可以做类似的事情
INSERT INTO example (Parent, DataNameID) VALUES
(1, (select id from datanames where name='Foo')),
(1, (select id from datanames where name='Bar'))
答案 2 :(得分:-1)
您可能希望阅读load data (local) infile。它工作得很好,我一直都在使用它。
编辑:答案仅解决了各个插页的迟缓问题。正如@bemace指出的那样,它没有提及字符串ID。