SELECT与索引的UPDATE性能

rid*_*rid 18 mysql performance

如果我SELECTID然后UPDATE使用这些ID,那么UPDATE查询比我UPDATE使用中的条件更快SELECT.

为了显示:

SELECT id FROM table WHERE a IS NULL LIMIT 10; -- 0.00 sec
UPDATE table SET field = value WHERE id IN (...); -- 0.01 sec
Run Code Online (Sandbox Code Playgroud)

上述速度比UPDATE相同条件快100倍:

UPDATE table SET field = value WHERE a IS NULL LIMIT 10; -- 0.91 sec
Run Code Online (Sandbox Code Playgroud)

为什么?

注意:a编入索引.

Max*_*sky 30

很可能第二个UPDATE语句会锁定更多行,而第一个语句使用唯一键并仅锁定它要更新的行.

  • 是的,Radu可以测试 - 启动事务,运行查询,不提交,以及检查锁定的行数 (3认同)

Ben*_*oit 5

这两个查询并不相同。您只知道 ID 在表中是唯一的。

UPDATE ... LIMIT 10 最多更新 10 条记录。

如果有重复的 id,UPDATE ... WHERE id IN (SELECT ... LIMIT 10) 可能会更新 10 条以上的记录。


Abh*_*hay 5

我认为对于您的“为什么?”没有一个直接的答案。无需进行某种分析和研究。

SELECT 查询通常会被缓存,这意味着如果多次运行同一个 SELECT 查询,第一个查询的执行时间通常大于后续查询。请注意,只有在 SELECT 很重的情况下才能体验到这种行为,而在即使是第一个 SELECT 也快得多的情况下也不会。因此,在您的示例中,由于缓存,SELECT 可能需要 0.00 秒。UPDATE 查询使用不同的 WHERE 子句,因此它们的执行时间很可能不同。

虽然该列a已被索引,但在执行 SELECT 或 UPDATE 时,MySQL 不一定必须使用该索引。请研究 EXPLAIN 输出。另外,查看输出SHOW INDEX并检查“评论”列是否为任何索引读取“禁用”?你可以在这里阅读更多 - http://dev.mysql.com/doc/refman/5.0/en/show-index.htmlhttp://dev.mysql.com/doc/refman/5.0/en/mysql-索引.html

此外,如果我们暂时忽略 SELECT 并只关注 UPDATE 查询,很明显它们并没有使用相同的 WHERE 条件——第一个在idcolumn 上运行,后者在a. 虽然两列都被索引,但并不一定意味着所有表索引的表现都一样。根据索引的大小或索引列的数据类型,或者它是单列还是多列索引,某些索引可能比其他索引更有效。当然可能还有其他原因,但我不是这方面的专家。

此外,我认为第二个 UPDATE 正在做更多的工作,因为与第一个 UPDATE 相比,它可能放置了更多的行级锁。确实,两个 UPDATES 最终都更新了相同数量的行。但是在第一次更新中,锁定了 10 行,我认为在第二次更新中,所有a为 NULL(大于 10)的行在执行更新之前都被锁定。也许 MySQL 首先应用锁定,然后运行 ​​LIMIT 子句以仅更新有限的记录。

希望以上解释有道理!