添加索引时MySQL表文件变大,但删除索引

时间:2017-03-11 21:04:17

标签: mysql

我正在尝试使用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。

为什么它不会回到原来的尺寸?我怎样才能做到这一点?

1 个答案:

答案 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