You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
optimize table、analyze table 和 alter table 这三种方式重建表的区别?
MySQL 5.6 版本开始,alter table t engine = InnoDB(也就是 recreate)默认是上图的流程;
analyze table t 其实不是重建表,只是对表的索引信息做重新统计,没有修改数据,这个过程中加了 MDL 读锁;
optimize table t 等于 recreate+analyze。
参数 innodb_file_per_table
表数据既可以存在共享表空间里,也可以是单独的文件。这个行为是由参数 innodb_file_per_table 控制的:
建议设置为 ON,一个表单独存储为一个文件更容易管理,而且在你不需要这个表的时候,通过 drop table 命令,系统就会直接删除这个文件。而如果是放在共享表空间中,即使表删掉了,空间也是不会回收的
数据删除
InnoDB 删除记录时,只会把记录标记为已删除,如果再插入符合条件的记录会复用,但是磁盘大小不会变
如果删除一个页上的所有记录,整个页就会被标记为已删除,可以被复用到任何位置。
如果相邻的两个数据页利用率都很小,系统就会把这两个页上的数据合到其中一个页上,另外一个数据页就被标记为可复用
如果删除整个表,所有的数据页都会被标记为可复用。但是磁盘上,文件不会变小
数据插入
如果数据是按照索引递增顺序插入的,那么索引是紧凑的。但如果数据是随机插入的,就可能造成索引的数据页分裂
经过大量增删改的表,都是可能是存在空洞的
重建表
使用 alter table A engine=InnoDB 命令来重建表,MySQL 会自动完成转存数据、交换表名、删除旧表的操作
显然花时间最多的步骤是往临时表插入数据的过程,如果在这个过程中,有新的数据要写入到表 A 的话,就会造成数据丢失。因此,在整个 DDL 过程中,表 A 中不能有更新。也就是说,这个 DDL 不是 Online 的
Online DDL
MySQL 5.6 版本开始引入的 Online DDL,引入之后的创建流程:
DDL 之前是要拿 MDL 写锁的,这样还能叫 Online DDL 吗?
alter 语句在启动的时候需要获取 MDL 写锁,但是这个写锁在真正拷贝数据之前就退化成读锁了。
为什么要退化呢?为了实现 Online,MDL 读锁不会阻塞增删改操作。
那为什么不干脆直接解锁呢?为了保护自己,禁止其他线程对这个表同时做 DDL。
The text was updated successfully, but these errors were encountered: