首页
学习
活动
专区
圈层
工具
发布

MySQL里的MVCC

我们换个角度来解读一下, 在表设计中,我们有一种策略,那就是尽可能保留数据变化的历史,比如在数据发生变化时我们不会直接删除数据,而是把它转换为两类操作。...那么在MySQL中会先在T1时间生成一个快照,比如数据标识是90,然后在这个基础上进行数据修改,数据标识为100,但是事务未提交。...明白了这些,理解InnoDB的MVCC就很简单了,我们使用类似的思路来做下解读,假设在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的创建时间,一个保存的是行的删除时间。...undo日志的指针; (3)DELETE BIT,标识该记录是否被删除,不是真正的删除数据; 把这三个列组合起来,就可以标记数据的周期性,并定位到相应的事务,在需要的时候进行回滚。...=3,变成id=1 对于InnoDB来说,无论是更新,删除,都只是设置行记录上的deleted version标记位,而不是真正的删除记录,后续这些记录的清理,是通过Purge后台进程实现的。

2.3K41
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    讲讲MySQL的删除

    删除并不是真正的删除 熟悉mysql的同学都应该知道,当我们执行delete的时候,数据并没有被真正的删除,只是对应数据的删除标识deleteMark被打开了,这样每次执行查询的时候,如果发现数据存在但是...deleteMark是开启的话,那么依然返回空,因为这个细节,所以经常会出现“我明明删除了数据,为什么空间没释放”的现象。...15M 7 6 18:46 user_info.ibd #删除前 15M 10 4 16:47 user_info.ibd #删除后 为什么不直接删除,而是打个标记 只是打个标记的话,岂不是很浪费空间...mysql里面有个purge线程,它的工作中有一项任务就是专门检查这些有deleteMark的数据,当有deleteMark的数据如果没有被其他事务引用时,那么会被标记成可复用,因为叶子节点数据是有序的原因...的数据,将近2千万,如果你的数据行占用的空间更小,就可以存下更多的数据,所以只是简单的根据数据行数来判断是否需要分表不是那么的合理。

    3.8K20

    MySQL 超大表的删除方法

    MySQL里面直接对大表执行drop table删除有可能导致mysql hang住。必须使用些特殊的方法。 先搞一个大表出来,如下图: ? 可以看到t2表的ibd大小为2.7GB了 ?...创建一个硬链接的好处就是: 硬链接就是增加了对文件的引用,只有对磁盘上文件的引用完全没有了的话,这个文件才能是删除的。...我们对t2.ibd 建立硬链接后,当我们执行drop table t2; 的时候,实际上只是删除了对t2.ibd的一个文件引用,我们t2.ibd_hdlk对物理文件的引用还是存在的,就不会执行OS级别的删除操作...这种对线上mysql的影响降到很低。...2、执行实际的删除 droptable test.t2; 3、使用coreutils工具集执行OS级别的文件删除 下载地址: ftp://alpha.gnu.org/gnu/coreutils/ tar

    8.9K50

    mysql删除主键和删除索引(含删除unique索引)

    mysql删除主键和删除索引(含删除unique索引) ##删除表 DROP TABLE config_back; ##删除主键 ALTER TABLE config_back DROP PRIMARY...0未删除 1已删除', PRIMARY KEY (`id`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='配置表备份表...' 在MySQL中移除主键有以下几种不同的实现方法: 使用ALTER TABLE语句移除主键约束: ALTER TABLE 表名 DROP PRIMARY KEY; 这种方法适用于需要移除表中已有主键的情况...使用ALTER TABLE语句修改主键约束: ALTER TABLE 表名 DROP PRIMARY KEY, ADD PRIMARY KEY (列名); 这种方法适用于需要将原来的主键替换为其他列作为新的主键的情况...ALTER TABLE config_back DROP PRIMARY KEY, ADD UNIQUE KEY (`price_end`); ##删除索引(含删除unique索引) ALTER TABLE

    5.3K10

    删除mysql日志文件

    今天发现网站不能正常访问,于是登陆服务器查找问题。机智的我随手用命令:df -l 发现 硬盘爆满了,于是就知道问题所在了。...的日志文件占据了大部分空间 , 整整27G,于是现在的任务就是清理mysql的日志文件(主要是清理.log文件和mysql-bin.00000X二进制日志文件) 一、删除mysql日志文件 第一步:登陆进入...mysql-bin.000005,那么删除日志文件的时候应该排除掉该文件。...删除后就能释放大部分空间。 二、mysql 定时清理日志文件 如果每次等到发现空间不足的时候才去手动删除日志文件, 这种方式是很不理想的。...的值 (这里设置的自动删除时间为10天, 默认为0不自动删除)expire_logs_days=10修改后,重启mysql就会生效。

    5.1K00

    mysql删除操作其实是假删除

    在 InnoDB 中,你的 delete 操作,并不会真的把数据删除,mysql 实际上只是给删除的数据打了个标记,标记为删除,因此你使用 delete 删除表中的数据,表文件在磁盘上所占空间不会变小,...#先删除表所有数据,再重新查看表文件大小 mysql> delete from t; Query OK, 100000 rows affected (0.46 sec) mysql> use information_schema...这些被删除的记录行,只是被标记删除,是可以被复用的,下次有符合条件的记录是可以直接插入到这个被标记的位置的。...比如我们在 id 为 300-600 之间的记录中删除一条 id=500 的记录,这条记录就会被标记为删除,等下一次如果有一条 id=400 的记录要插入进来,那么就可以复用 id=500 被标记删除的位置...这些被标记删除的记录,其实就是一个空洞,有种占着茅坑不拉屎的感觉,浪费空间不说,还会影响查询效率。

    3.8K30

    MySQL异步删除大表的方法

    背景在MySQL中有大表需要清理,该表超过100GB,不敢直接delete或者truncate、drop,怕影响业务。...delete、truncate、drop的区别一般情况下(少量数据),不同的场景可以选择不同的方式来做数据删除。...常见的大表删除方式对于大表的场景,常见的做法:小批量、分批删除;由于直接使用delete,是逐步删除,直接delete不带where条件肯定是不科学的。...当执行 drop table 后,删除的只是该文件的一个硬连接。之后后台线程扫描到硬连接目录中有需要删除的文件,自动在后台 truncate 前面 drop 掉表数据文件。...建议数据量小的时候,清空表数据,使用truncate命令,删除表可直接drop数据量大的时候,使用创建硬链接的方式,drop table后再逐步删除文件;使用TDSQL的话,打开异步删除配置参数,直接drop

    6.4K110

    MySQL 批量删除表的实现方式

    在实际应用中,有时候需要批量删除以特定前缀命名的表(如数据清理或数据处理时生成的临时表)。这里分享实现这一功能的方法和注意事项,以便避免实现过程中出现问题。...使用流转逐表删除 这个方法适合对表量较多的情况,通过流转一个一个删除: -- 先删除已存在的存储过程 DROP PROCEDURE IF EXISTS DropTablesWithPrefix; --...通过脚本实现 如果想使用脚本来控制操作,例如使用 Python 进行删除: Python 脚本示例 import mysql.connector # 连接数据库 conn = mysql.connector.connect...批量删除表时,需要根据实际场景选择适合的方法: 对表量少的情况,可使用动态 SQL。...对表量多的情况,可使用流转或脚本执行。 最后,确保删除操作前备份数据,避免事故。

    4.2K10

    Windows下MySQL的安装和删除

    按照下面删除步骤 删除完成 在重装 彻底删除Mysql 删除的基础条件 停止MySQL的运行 将MySQL服务停止,这里我只有一个MySQL服务,如有多个MySQL服务,也要全部停止掉。...net stop 要删除的mysql服务的名称 卸载mysql server等设备 删除MySQL安装目录下的MySQL文件夹 这个文件目录找不到别找着急 下面步骤能找到 打开注册表编辑器...mysql的位置 删除目录“C:\ProgramData\MySQL”文件夹 删除目录C:\ProgramData\MySQL文件夹,如果显示正在被其他应用所使用,无法进行删除,那么就需要重新启动电脑...再次打开服务,查看是否有MySQL卸载残留 如果已经将MySQL卸载,但通过开始 -》所有应用 -》Windows管理工具 -》服务查看到MySQL服务仍然残留在系统服务里。...又不想改服务名,改怎么办呢。 只要在CMD里输入一条命令就可以将服务删除: sc delete mysql //这里的mysql是你要删除的服务名 这样一来服务就被删除了。

    91910
    领券