首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SELECT vs UPDATE performance with index

SELECT vs UPDATE performance with index
EN

Stack Overflow用户
提问于 2011-07-14 23:47:17
回答 6查看 10.5K关注 0票数 21

如果我先对ID执行SELECT操作,然后再使用这些ID执行UPDATE操作,那么UPDATE查询比使用SELECT中的条件执行UPDATE查询要快。

举例说明:

代码语言:javascript
复制
SELECT id FROM table WHERE a IS NULL LIMIT 10; -- 0.00 sec
UPDATE table SET field = value WHERE id IN (...); -- 0.01 sec

在相同条件下,上述方法大约比UPDATE快100倍:

代码语言:javascript
复制
UPDATE table SET field = value WHERE a IS NULL LIMIT 10; -- 0.91 sec

为什么?

注意:a列已编入索引。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-07-17 15:59:12

第二个UPDATE语句很可能锁定更多的行,而第一个语句使用唯一键,只锁定要更新的行。

票数 33
EN

Stack Overflow用户

发布于 2011-07-15 00:08:26

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

更新...LIMIT 10最多只能更新10条记录。

更新...WHERE id IN (SELECT ...限制10)如果存在重复的ids,则可以更新10条以上的记录。

票数 5
EN

Stack Overflow用户

发布于 2011-07-18 00:50:00

我不认为对你的“为什么?”有一个直接的答案。而不做任何分析和研究。

SELECT查询通常被缓存,这意味着如果您多次运行同一个SELECT查询,则第一个查询的执行时间通常比后面的查询长。请注意,这种行为只能在SELECT很重的情况下发生,而不是在即使是第一次SELECT也要快得多的情况下。因此,在您的示例中,由于缓存的原因,SELECT可能花费了0.00s。UPDATE查询使用不同的WHERE子句,因此它们的执行时间可能不同。

虽然对列a进行了索引,但在执行SELECT或UPDATE操作时,MySQL不必使用该索引。请研究解释输出。另外,查看SHOW INDEX的输出并检查是否有索引的"Comment“列显示为"disabled”?你可以在这里阅读更多- http://dev.mysql.com/doc/refman/5.0/en/show-index.htmlhttp://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

此外,如果我们暂时忽略SELECT而只关注UPDATE查询,那么很明显它们使用的不是相同的WHERE条件--第一个条件在id列上运行,而后者在a上运行。虽然这两列都建立了索引,但这并不意味着所有的表索引都执行得一样。某些索引可能比另一个更有效,这取决于索引的大小、索引列的数据类型或它是单列索引还是多列索引。当然还有其他原因,但我不是这方面的专家。

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

希望上面的解释是有意义的!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6696063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档