update语句走索引更新到数据和没更新到,哪个性能更好

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】6.5.3
【复现路径】测试发现update没更新到数据,比更新到性能更差
【遇到的问题:问题现象及影响】不清楚原因
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】

我猜没找到数据检索数据更慢吧,有序的查找一般是折半查找,没找到可能搜索次数多

应该是没更新到更慢吧,
没更新到代表检索所有数据没有找到更新目标,
更新到代表检索数据量小于等于所有数据就找到更新目标了。
单从数据量上来说,没更新到就应该慢。

看下执行计划,对比以下,那个扫描到的行多,哪个就更慢。。。

实践是检验真理的唯一标准,还是自己动手多准备点数据,看执行计划再说,有时候经验也说不准是错的。

我觉得update也是先查询数据然后根据找到的数据做插入操作,可以把update改成select 看看性能怎么样。

单纯从数据量推论快慢并不合理

2个的explain analyze发下

好像是不够严谨,发现是where条件匹配的值如果没有索引,匹配不到可能更慢,有索引的情况,匹配不到更快。但是也不绝对,和数数据量可能也有关系。目前还没有发现这方面的资料,不知道有没有专业的结果

:thinking:你这么一说我想起来了,update机制不是相当于 删除+新增 么?

1 个赞

同样是匹配不到。那就是都没有后续删除+更新这个操作。其实就是纯select的时间吧。

select有索引,和没索引的差距。这不就很显然了。

测试的什么数据。更新到和没更新到时什么情情况下。感觉楼主应分不同的情况下
比如 走索引 更新1条数据 update t set c=‘1’ where a=‘2’ 条件 是2 和10000000 其中后面是没有数据的,更新失败。索引顺序是asc 或者desc 那种情况比较费时。

看看执行计划