MySQL 中删除的数据都去哪儿了?
发布时间:2022-10-08 16:12:08 所属栏目:MySql教程 来源:
导读: 不知道大家有没有想过下面这件事?
我们平时调用 DELETE 在 MySQL 中删除的数据都去哪儿了?
这还用问吗?当然是被删除了啊
MySQL 删除数据表_mysql 删除多表数据_mysql 删除重复数据
我们平时调用 DELETE 在 MySQL 中删除的数据都去哪儿了?
这还用问吗?当然是被删除了啊
MySQL 删除数据表_mysql 删除多表数据_mysql 删除重复数据
|
不知道大家有没有想过下面这件事? 我们平时调用 DELETE 在 MySQL 中删除的数据都去哪儿了? 这还用问吗?当然是被删除了啊 MySQL 删除数据表_mysql 删除多表数据_mysql 删除重复数据 那么这里又有个新的问题了,如果在 InnoDB 下,多事务并发的情况下,如果事务A删除了 id=1 的数据,同时事务B又去读取 id=1 的数据,如果这条数据真的被删除了,那 MVCC 拿啥数据返回给用户呢? 没错,这就需要了解一下 MySQL 的多版本并发的原理相关的东西,感兴趣的可以去看我之前写的这篇文章。 所以,实际情况中,调用了 DELETE 语句删除的数据并不会真正的被物理删除,这条数据其实还在那,只不过被打上了一个标记,标记已删除。 这其实跟我们日常的操作——软删除,差不多是一个意思 MySQL 删除数据表_mysql 删除重复数据_mysql 删除多表数据 在 MySQL 中, UPDATE 和 DELETE 操作本质上是一样的, 都属于更新操作,删除操作只不过是把某行数据中的一个特定的比特位标记为已删除,仅此而已。 那么问题又来了,那这些删除的数据如果一直这么堆下去,那不早晚把硬盘撑爆? mysql 删除多表数据_MySQL 删除数据表_mysql 删除重复数据 如果都玩儿成这样了,那 MySQL 还能像现在这样被大规模的用于生产环境中吗?那 MySQL 到底是怎么玩的? 这就需要提到 Purge 操作了。 Purge操作是啥? Purge 操作才是真正将数据(已被标记为已删除)物理删除的操作。 MySQL 删除数据表_mysql 删除多表数据_mysql 删除重复数据 Purge 操作针对的数据对象,不仅仅是某一行,还有其对应的索引数据和 Undo Log。 好的那么问题又来了。 MySQL 删除数据表_mysql 删除多表数据_mysql 删除重复数据 问题是,Purge 操作什么时候会执行呢?实际上,你可以将执行 Purge 操作的线程(简称 Purge 线程)理解成一个后台周期性执行的线程。 Purge 线程可以有一个,也可以有多个,具体的线程数量可以由 MySQL 的配置项 innodb_purge_threads 来进行配置。当然,我相信你肯定不记得在使用 MySQL 的时候配置过这个,因为 innodb_purge_threads 有个默认值,值为 4。 InnoDB 会根据 MySQL 中表的数量和 Purge 线程的数量进行分配。 MySQL 删除数据表_mysql 删除多表数据_mysql 删除重复数据 但正是因为有这种特性,Purge 线程的数量才需要根据业务的实际情况来做调整。举个例子,假设 DML 操作都集中在某张表,比如表1上... 你先等等,我打断一下...... 什么叫 DML 操作?总喜欢搞些复杂的名词...DML(Data Manipulation Language)数据操作语句,实际上就是CRUD增删改查... 与之类似的概念还有DDL(Data Definition Language)数据定义语句,也就是CREATE、DROP和ALTER等等. 以及DCL(Data Control Language)数据控制语句,也就是GRANT、REVOKE等等... 继续说回来MySQL 删除数据表,虽然 Purge 线程的数量是可配置的,但是也不是你想配多少就配多少的。不然你给它干个 10000 个线程,那不就直接原地 OOM 了吗? innodb_purge_threads 的最大值为 32,而且并不是我们配了 32 InnoDB 就真的会启动 32 个 Purge 线程,为啥呢?举个很简单的例子,假设此时只有一张表,然后我们配置了 32 个 Purge 线程。 (编辑:海洋资讯信息网_我爱站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐

