Mysql性能:哪个查询需要更多时间?

Mysql性能:哪个查询需要更多时间?,mysql,sql,database-performance,query-performance,sqlperformance,Mysql,Sql,Database Performance,Query Performance,Sqlperformance,我有两张桌子: 1.包含约1000万数据的用户表 列:令牌类型、客户类型 2.具有200k数据的pm_tmp表 列:idPrimary |自动递增,用户id 用户id是客户id的外键 第一种方法/查询: update user set token_type='PRIME' where cust_id in (select user_id from pm_tmp where id between 1 AND 60000); 第二种方法/查询:在这里,我们将针对60000条记录的不同客户id分别执

我有两张桌子: 1.包含约1000万数据的用户表 列:令牌类型、客户类型 2.具有200k数据的pm_tmp表 列:idPrimary |自动递增,用户id

用户id是客户id的外键

第一种方法/查询:

update user set token_type='PRIME'
where cust_id in (select user_id from pm_tmp where id between 1 AND 60000);
第二种方法/查询:在这里,我们将针对60000条记录的不同客户id分别执行以下查询:

update user set token_type='PRIME' where cust_id='1111110';

从理论上讲,第一次查询的时间会更少,因为它涉及的提交次数更少,而重建索引的次数也更少。但是,我建议使用第二个选项,因为它更容易控制,而且时间更短,您可以考虑并行执行两个独立的事件集

注意:第一个查询需要为mysql缓冲区提供足够的内存,以便快速执行。第二个查询是一组独立的单事务查询,它们需要的内存相对较少,因此如果在内存有限的环境中执行,会显示得更快

那么,您也可以这样重写第一个查询


更新用户u,pm_tmp set u.token_type='PRIME',其中u.cust_id=p.id和p.in某些版本的MySQL在优化中遇到问题。我建议:

update user u join
       pm_tmp pt
       on u.cust_id = pt.user_id and pt.id between 1 AND 60000
    set u.token_type = 'PRIME' ;
注意:这假设客户id在pm\U temp中不重复。如果可能的话,您将需要一个select distinct子查询

您的第二个版本通常会慢很多,因为它需要执行数千个查询,而不是一个查询。一个考虑因素可能是更新。随着更新数量的增加,日志记录和锁定可能会变得更加复杂。实际上,我对MySQL内部的了解还不够,不知道这是否会对性能产生重大影响。

在SELECT中。。。优化效果不佳。我不能提供细节,因为在MySQL的一些最新版本中,UPDATE和IN都得到了更好的优化。只需在SELECT中说“避免…”就足够了

你的第一句话应该是行而不是列

回到问题的其余部分。60K太大了。我只推荐1000个。除此之外,戈登的答案可能是最好的

但是。。。您没有使用偏移量;不要被诱惑去使用它;当你越来越深入到表格中时,它会扼杀性能

还有一件事。在每个块之后提交。否则你会建立一个巨大的撤销日志;这增加了成本。这也是1K可能比60K快的原因

但是等等!你为什么要更新一张大桌子?这通常是糟糕的模式设计的标志。请解释数据流


也许您已经计算了哪些项要标记为“prime”?好吧,你可以把这个列表放在周围,在阅读的时候加入到选择中去发现质数。这完全消除了有问题的更新。当然,连接需要花费一些钱,但并不多。

当你测量它时,你得到了什么结果?第二种方法花费的时间更少。但我正在试图找出原因,因为第一个查询需要为您的innodb缓冲池提供足够的内存,以便快速执行。第二个是单事务查询,需要的时间相对较少。