mysql 如何得知update了多少条

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 如何得知update了多少条相关的知识,希望对你有一定的参考价值。

有时候我们会不小心对一个大表进行了 update,比如说写错了 where 条件......

此时,如果 kill 掉 update 线程,那回滚 undo log 需要不少时间。如果放置不管,也不知道 update 会持续多久。

那我们能知道 update 的进度么?


实验

我们先创建一个测试数据库:

快速创建一些数据:

连续执行同样的 SQL 数次,就可以快速构造千万级别的数据:

查看一下总的行数:

我们来释放一个大的 update:

然后另起一个 session,观察 performance_schema 中的信息:

可以看到,performance_schema 会列出当前 SQL 从引擎获取的行数。

等 SQL 结束后,我们看一下 update 从引擎总共获取了多少行:

可以看到该 update 从引擎总共获取的行数是表大小的两倍,那我们可以估算:update 的进度 = (rows_examined) / (2 * 表行数)

💡小贴士

information_schema.tables 中,提供了对表行数的估算,比起使用 select count(1) 的成本低很多,几乎可以忽略不计。

那么是不是所有的 update,从引擎中获取的行数都会是表大小的两倍呢?这个还是要分情况讨论的,上面的 SQL 更新了主键,如果只更新内容而不更新主键呢?我们来试验一下:

等待 update 结束,查看 row_examined,发现其刚好是表大小:

那我们怎么准确的这个倍数呢?

一种方法是靠经验:update 语句的 where 中会扫描多少行,是否修改主键,是否修改唯一键,以这些条件来估算系数。

另一种方法就是在同样结构的较小的表上试验一下,获取倍数。

这样,我们就能准确估算一个大型 update 的进度了。

参考技术A

两种方法

    updata之前可以先select一下看有多少条

    执行update以后会有提示多少条

本回答被提问者采纳

mysql 如何更新某一条数据内容

表字段有id、name、finished,finished默认都是0,我想先把finished不为1的数据先select出来(这语法会),然后选择某行的数据把finished改为1(这里的update不会,应该怎么写),where id作限制好像不行,因为select出来的id已经被打乱了(假如id=2的数据原来的finished是1,那就不会被选择,也就是表没有id=2的数据,我是用java swing写的表格,需要修改某一行的数据,从而修改数据库的finished),那我该怎么做才能更新第x行的finished呢

参考技术A 数据库的数据ID是唯一的啊,读进java表后也是唯一的,是一一对应的 参考技术B update 表 set finished=1 where id=3 and finished<>1追问

这好像也不行,因为我读进java表格的数据是finished不等于1的,所以java表格里第三行可能对应的数据库里的是id=5而不是id=3,例如id=1,finished=1;id=2,finished=1;id=3,finished=1;id=4,finished=0;id=5,finished=0;那读进java表格的数据只有id=4,5,我选择java表格第二行,对应就是数据库第5行了

追答

把id条件去掉。

追问

但我不是把所有行的finished都改为1啊,换个说法,有一个表里id从1开始递增,我想更新这表里第5行finished不为1的的数据,但那一行肯定id不等于5

本回答被提问者采纳

以上是关于mysql 如何得知update了多少条的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 对于千万级的大表要怎么优化

MySQL中(insert/update/delete)到底有多少种写法?

MySQL中(insert/update/delete)到底有多少种写法?

如何计算Mysql单表中能存放多少条数据

mysql数据库支持多少条数据

mysql数据库支持多少条数据