为什么mysql在执行更新WHERE IN查询(在PK上)时速度慢,因为我在表中进行了更深入的迭代

为什么mysql在执行更新WHERE IN查询(在PK上)时速度慢,因为我在表中进行了更深入的迭代,mysql,performance,Mysql,Performance,我有两个数据库: 数据库A 数据库B 性能问题 我正在执行一个查询,从数据库a中获取一批作业(100个作业),并在数据库B中创建一个副本,然后用a将它们标记为in_B: UPDATE jobs SET in_b=1 WHERE job_id IN (1,2,3.....) 这很有效。在我达到job_id值>2000000之前,行的传输速度相当快。获取一批作业的select查询仍然很快(4ms),但update语句要慢得多 这有什么原因吗?我搜索了MySQL-Docs/Stackoverflow

我有两个数据库:

数据库A 数据库B 性能问题 我正在执行一个查询,从数据库a中获取一批作业(100个作业),并在数据库B中创建一个副本,然后用a将它们标记为
in_B

UPDATE jobs SET in_b=1 WHERE job_id IN (1,2,3.....)
这很有效。在我达到job_id值>2000000之前,行的传输速度相当快。获取一批作业的select查询仍然很快(4ms),但update语句要慢得多

这有什么原因吗?我搜索了MySQL-Docs/Stackoverflow,看看将“IN”转换为“OR”查询是否会改进此查询,但普遍的共识是,在大多数情况下,“ON”查询会更快

如果有人知道为什么会发生这种情况,以及我如何在达到1000多万行时避免这种减速,我将不胜感激

提前感谢,

灰烬


另外,我正在通过两个RESTful服务(每个DB连接一个)完成这些更新/选择/插入,但是从作业id 1到2mil等这是一个常数。

您的
更新
查询正在逐渐变慢,因为它必须从您的大表中读取许多行才能找到需要处理的行。它可能正在进行所谓的全表扫描,因为没有合适的索引

专业提示:当一个查询开始运行得很快,但随着时间的推移变得越来越慢时,这表明需要进行优化(可能是索引)

要优化此查询,请执行以下操作:

UPDATE jobs SET in_b=1 WHERE job_id IN (1,2,3.....)
在job_id列上创建索引,如下所示

CREATE INDEX job_id_index ON jobs(job_id)

这将允许您的查询在(2,3,6)搜索筛选器中找到需要快速更新的记录。

所以您正在更新2M行,并且惊讶于它不是即时更新的?PS:您的架构引用了一个不存在的列。我一次更新100行。Restful-B:从DB-B中获取100行:插入这100行Restful-B:从DB-A中接收这100行:更新100行可重复使用
而不是(1,2,3)
中的
?数据库A和B是在同一台服务器上,还是在不同的服务器上?您是否可以灵活地添加一些索引?@OllieJones-数据库位于不同的服务器上,我可以添加索引。我不能保证中间查询可以工作,因为Restful-B服务只告诉Restful-a更新成功复制的作业。i、 e.如果从A收到的100行中,只有98行成功复制到B中,则仅对这98个作业执行更新。
job\u id
不是主键,请尝试使用主键搜索,或至少在
job\u id
上添加索引。顺便说一下,如果您只是想复制(同步)数据库,为什么不使用数据库复制呢?这里有一些关于
UPDATE jobs SET in_b=1 WHERE job_id IN (1,2,3.....)
CREATE INDEX job_id_index ON jobs(job_id)