以下哪一项会更好?
(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)')
我必须数百万次来完成此任务,所以我正在寻找这种模式的最佳性能。最好是哪一个?为什么?
insert ignore出于多种原因,这是更好的方法。
insert ignore
在性能方面,仅编译和执行一个查询,而不是两个。这节省了将内容移入和移出数据库的开销。
在维护方面,只有一个查询是更可维护的,因为逻辑全部放在一个地方。where例如,如果添加了子句,则您很可能会错过在两个单独的查询中添加子句的可能性。
where
就准确性而言,只有一个查询应该没有(或至少少很多)竞争条件的机会。如果在select和之间插入一行insert,那么您仍然会收到错误消息。
select
insert
然而,比insert ignore是insert . . . on duplicate key update。后者仅避免了重复问题的错误。 insert ignore可能会忽略您实际上关心的错误。
insert . . . on duplicate key update
顺便说一句,无论如何,您应该检查语句中的错误。