我正在尝试使用MySQL来查看文件大小在向其添加索引和大量数据时的增长情况等等。
CREATE TABLE IF NOT EXISTS test_table (
a TINYINT UNSIGNED NOT NULL,
b TINYINT UNSIGNED NOT NULL
);
在没有索引的简单两列TINYINT表上添加100万行后,使用InnoDB作为引擎,test_table大小(test_table.ibd)为36 MB。
添加数据的查询:
DROP PROCEDURE IF EXISTS test_procedure;
DELIMITER //
CREATE PROCEDURE test_procedure
(IN loop_amount INT)
BEGIN
DECLARE rand_max INT DEFAULT 254;
DECLARE a, b, c INT;
DECLARE i INT DEFAULT 0;
TRUNCATE TABLE test_table;
WHILE i < loop_amount DO
SET a = RAND() * rand_max + 1;
SET b = RAND() * rand_max + 1;
INSERT INTO test_table VALUES (a, b);
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
CALL test_procedure(1000000);
在b上添加单个索引后如下:
ALTER TABLE test_table ADD INDEX (b);
文件test_table.ibd增长到48 MB。在向其添加索引时它会增长。
在我删除索引之后:
DROP INDEX b ON test_table;
并确认表中没有带索引的索引:
SHOW INDEX FROM test_table;
我看到文件test_table.ibd仍然是48 MB。
我试过
OPTIMIZE TABLE test_table;
现在test_table.ibd是40 MB,但不是36 MB,因为它没有索引。
只有当我截断表并添加100万行运行上面的存储过程时,它才会回到36 MB。
为什么它不会回到原来的尺寸?我怎样才能做到这一点?
答案 0 :(得分:0)
看起来您正在使用带有innodb_file_per_table
选项的InnoDb。
在这种情况下,您可以运行optimize table test_table
并释放未使用的空间。
文档说明:&#34;当您运行OPTIMIZE TABLE时,InnoDB使用临时名称创建一个新的.ibd文件,仅使用存储实际数据所需的空间。优化完成后,InnoDB将删除旧的.ibd文件并将其替换为新文件。&#34; (见https://dev.mysql.com/doc/refman/5.7/en/innodb-multiple-tablespaces.html)