我有一个大型元素数据库,每个元素都有唯一键。每隔一段时间(每分钟一次)我就会加载更多需要添加到数据库中的项目,但如果它们与数据库中已有的内容重复,则会被丢弃。
我的问题是 - 对......来说更好:
干杯, 千斤顶
答案 0 :(得分:1)
如果你正在使用MySQL,你可以掌握INSERT IGNORE
的强大功能,这将是最高性能的解决方案。您可以直接使用游标API执行自定义SQL查询。 (https://docs.djangoproject.com/en/1.9/topics/db/sql/#executing-custom-sql-directly)
如果您使用的是Postgres或不支持INSERT IGNORE
的其他数据存储,那么事情会变得更复杂。
对于Postgres,您可以使用规则基本上制作自己的INSERT IGNORE
版本。
它看起来像这样:
CREATE RULE "insert_ignore" AS ON INSERT TO "some_table"
WHERE EXISTS (SELECT 1 FROM some_table WHERE pk=NEW.pk) DO INSTEAD NOTHING;
无论你做什么,都要避免选择所有行并检查第一种方法"因为最差情况下的性能是Python中的O(n),并且基本上会缩短数据库提供的任何性能优势,因为在应用程序计算机上执行检查(并且最终还是内存限制)。
try / except方法略微优于"选择所有行"方法,但它仍然需要不断切换到应用程序服务器来处理每个冲突,尽管要快得多。最好让数据库完成工作。