当表中有很多重复键时,'Insert on duplicate key update'比'select& Insert '慢?
create table names
(
id bigint unsigned auto_increment,
`name` varchar(255) NOT NULL,
primary key (id),
constraint uniq_name unique (`name`),
) ENGINE = InnoDB;
on duplicate update:
INSERT INTO names (`name`) VALUES ('name1') ON DUPLICATE KEY UPDATE `id`=`id`;
选择插入:
SELECT COUNT(1) WHERE `name`='name';
当count为0时:
INSERT INTO names (`name`) VALUES ('name1');
90%的简单查询是开销——跨网络发送、解析、优化、定位表中可能包含name = 'name'
的部分、收集结果(例如& count")、发送结果(至少是成功/失败)等等。两次查询意味着对每个查询执行两次。
此外,COUNT
可能比必要的更昂贵。如果没有以name
开头的INDEX
,则必须读取整个表。
如果name = 'name'
有很多行,COUNT
会告诉你有多少行,而你只需要知道是否有任何。
你有UNIQUE name
。在这种情况下,INSERT IGNORE
是一个明显的赢家。
一般规则:到服务器的往返次数更少==>更快。