0
我想用MySQL索引做一些测试,并希望通过实验看到不同类型的索引(覆盖,集群)对不同查询的影响。如何在MySQL中填充10亿行的测试表?
我有一个非常简单的表3 cols,a,b,c。
DROP TABLE IF EXISTS test_table;
CREATE TABLE IF NOT EXISTS test_table (
a INT UNSIGNED NOT NULL,
b INT UNSIGNED NOT NULL,
c INT UNSIGNED NOT NULL
);
然后我创建了一个存储过程,这个1000次从1随机值填充到100
DROP PROCEDURE IF EXISTS test_procedure;
DELIMITER //
CREATE PROCEDURE test_procedure
(IN loop_amount INT)
BEGIN
DECLARE rand_max INT DEFAULT 99;
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;
SET c = RAND() * rand_max + 1;
INSERT INTO test_table VALUES (a, b, c);
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
CALL test_procedure(1000);
,因为它经过1000个循环变得慢我不能跑了很多次。
然后我把桌子翻了13倍。
DROP PROCEDURE IF EXISTS test_procedure;
DELIMITER //
CREATE PROCEDURE test_procedure
(IN loop_amount INT)
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i < loop_amount DO
INSERT INTO test_table SELECT * FROM test_table;
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
CALL test_procedure(13);
但现在有大约1600万行,但因为它需要像一分钟,以1作为参数运行它,我不能再运行该功能时,加倍一次需要一分钟,下一个翻番需要2分钟等。我怎样才能达到10亿更快?
此外SELECT COUNT(*) FROM test_table;
也很慢。我如何加快速度以确认桌子尺寸?
确保删除该表上的所有索引。之后重新创建它们。 – Schwern
桌上还没有索引。 – Alex
'call test_procedure(10000);'花了1.8秒,'调用test_procedure(100000);'花了18秒,'调用test_procedure(1000000);'在我的2011年Macbook上花了172秒。正如预期的那样,它似乎正在线性扩大,因此10亿应该需要大约1800秒。你看到什么样的时候?我有一个SSD,所以I/O非常快,这可能是一个主要因素。 – Schwern