admin

执行SQL'不存在时插入'的最有效方法

sql

以下哪一项会更好?

(1) **INSERT IGNORE**
cursor.execute('INSERT IGNORE INTO table VALUES (%s,%s)')

(2) **SELECT or CREATE**
cursor.execute('SELECT 1 FROM table WHERE id=%s')
if not cursor.fetchone():
    cursor.execute('INSERT INTO table VALUES (%s,%s)')

我必须数百万次来完成此任务,所以我正在寻找这种模式的最佳性能。最好是哪一个?为什么?


阅读 160

收藏
2021-07-01

共1个答案

admin

insert ignore出于多种原因,这是更好的方法。

在性能方面,仅编译和执行一个查询,而不是两个。这节省了将内容移入和移出数据库的开销。

在维护方面,只有一个查询是更可维护的,因为逻辑全部放在一个地方。where例如,如果添加了子句,则您很可能会错过在两个单独的查询中添加子句的可能性。

就准确性而言,只有一个查询应该没有(或至少少很多)竞争条件的机会。如果在select和之间插入一行insert,那么您仍然会收到错误消息。

然而,比insert ignoreinsert . . . on duplicate key update。后者仅避免了重复问题的错误。
insert ignore可能会忽略您实际上关心的错误。

顺便说一句,无论如何,您应该检查语句中的错误。

2021-07-01