mysql - 在重复键更新上插入比选择和插入更慢?
问题描述
当表中有很多重复键时,“重复键更新时插入”比“选择和插入”慢?
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');
解决方案
90% 的简单查询都是开销——跨网络发送、解析、优化、定位可能包含的表部分name = 'name'
、收集结果(例如“计数”)、将结果(至少成功/失败)发送回来,等等。两个查询意味着每个查询都做两次。
此外,这COUNT
可能比必要的成本更高。如果您没有以INDEX
开头name
,则必须读取整个表格。
而且,如果有很多行name = 'name'
,COUNT
将告诉您有多少行,而您只需要知道是否有任何行。
你确实有UNIQUE name
。在这种情况下,INSERT IGNORE
是明显的赢家。
一般规则:到服务器的往返次数更少 ==> 更快。
推荐阅读
- r - R中的数据整理与日期时间列和多个观察
- typescript - 如何根据平台导入模块
- c++ - 如果我使用 ./program_name 执行我的程序,如何在 C++ 中获取文件名
如果我正在执行这样的程序: ./program_name<file_name 如何在 c++ 中获取文件名。
我尝试在主文件和打开文件中使用argue[1],例如。
int main(int argc, char *argv[]){ ifstream file; file.open(a
- ruby-on-rails - 从 Ruby 脚本运行 Rails Runner
- google-apps-script - DriveApp 方法的单亲行为
- java - 在 Docker 映像中的 Tomcat 中部署 Spring Boot 应用程序
- amazon-web-services - 在 yaml 文件中使用 CloudFormation 帮助程序脚本安装 nginx 时遇到困难
- python - 在 Visual Studio Code 中使用 Python 进行远程 SSH 的动态端口和主机
- python - 如何正确存储 HStore 字段?
- php - PHP 错误 500 FastCGI 进程在 SQL Server 存储过程上间歇性地超出超时错误