这期面试官提的问题是:
MySQL 表删除一半数据,表空间是否会变小?为什么?
我:
你这么问,肯定是不会?但是我不知道为什么(理直气壮.jpg)
国际惯例先上思维导图:
添加图片注释,不超过 140 字(可选)
遇到这种问题先做一波实验,我的思路验证下是否会删除。声明:此次实验采用的 MySQL 版本是 5.7,引擎是 InnDB
往期精彩
MySQL 查询语句是怎么执行的?
MySQL 索引
MySQL 日志
MySQL 事务与 MVCC
MySQL 的锁机制
MySQL 字符串怎么设计索引?
面试官:数据库自增 ID 用完了会咋样?
面试官:order by 怎么优化?
面试官:count (*) 怎么优化?
面试官:explain 应该关注哪些指标?
01 做个实验
首先整一张表结构:订单表 order,主键是 id,另外还有一个索引 index_city 用 city 字段建索引。
CREATE TABLE `order` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `user_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户编号', `goods_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品名称', `order_date` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下单时间', `city` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '下单城市', `order_num` int(10) NOT NULL COMMENT '订单号数量', PRIMARY KEY (`id`) USING BTREE, INDEX `city_index`(`city`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 2000002 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '商品订单表' ROW_FORMAT = Compact;
1.1 插入数据
造点数据,为了效果。我直接造 200W 条数据,然后直接 delete 删掉一半。
<