今天领导问我一个表是什么业务中使用的,说 这个表访问频繁吗? 我看这个表碎片很多,需要整理下空间,可能会几分钟的锁表
我看到这个表是做数据清洗用的 就通知领导可以整理空间了。
但是我自己不懂什么是整理空间 遂上网查询后得知 表在多次执行删除后 会产生碎片 导致mysql查询效率降低
执行OPTIMIZE TABLE后可以整理碎片空间 优化表
我执行的测试语句
新建一个表
CREATE TABLE sd(
id INT(4),
name VARCHAR(225)
);
创建一个执行计划
CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_to_sd`(IN num INT)
BEGIN
bq:WHILE num < 20000 DO
INSERT INTO sd(id,name) VALUES(num,'sssssdsdsds');
SET num=num+1;
END WHILE bq;
END;
调用执行计划 往sd表中插入2w条数据
CALL insert_to_sd(0);
插入后 直接查询表的信息 看到data_free的值
这里我有一个疑惑,不是说执行删除语句之后才会产生碎片 为什么 执行批量插入后data_free的值就有,并且很大
然后我执行了 OPTIMIZE TABLE sd;
显示ok
之后继续查询一下表信息
发现没有变化
这里我有另一个问题 为什么执行OPTIMIZE TABLE语句之后 data_free的值没有变化
然后我执行了删除语句
DELETE FROM sd WHERE id > 10000;
删除成功之后 在看一下表状态
data_free的值变大了 此时再执行一遍 OPTIMIZE TABLE语句
执行成功后再看一下表状态
发现data_free的值直接变0了
这是为啥???????希望有大佬能给我解答一下疑惑