首页 > 解决方案 > 在重复键更新上插入比选择和插入更慢?

问题描述

当表中有很多重复键时,“重复键更新时插入”比“选择和插入”慢?

create table names
(
    id         bigint unsigned auto_increment,
    `name`     varchar(255) NOT NULL,
    primary key (id),
    constraint uniq_name unique (`name`),
) ENGINE = InnoDB;

重复更新:

INSERT INTO names (`name`) VALUES ('name1') ON DUPLICATE KEY UPDATE `id`=`id`;

选择插入:

SELECT COUNT(1) WHERE `name`='name';

当计数为零时:

INSERT INTO names (`name`) VALUES ('name1');

标签: mysql

解决方案


90% 的简单查询都是开销——跨网络发送、解析、优化、定位可能包含的表部分name = 'name'、收集结果(例如“计数”)、将结果(至少成功/失败)发送回来,等等。两个查询意味着每个查询都做两次。

此外,这COUNT可能比必要的成本更高。如果您没有以INDEX开头name,则必须读取整个表格。

而且,如果有很多行name = 'name'COUNT将告诉您有多少行,而您只需要知道是否有任何行。

你确实有UNIQUE name。在这种情况下,INSERT IGNORE是明显的赢家。

一般规则:到服务器的往返次数更少 ==> 更快。


推荐阅读