2017-03-07 45 views
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;也很慢。我如何加快速度以确认桌子尺寸?

+0

确保删除该表上的所有索引。之后重新创建它们。 – Schwern

+0

桌上还没有索引。 – Alex

+0

'call test_procedure(10000);'花了1.8秒,'调用test_procedure(100000);'花了18秒,'调用test_procedure(1000000);'在我的2011年Macbook上花了172秒。正如预期的那样,它似乎正在线性扩大,因此10亿应该需要大约1800秒。你看到什么样的时候?我有一个SSD,所以I/O非常快,这可能是一个主要因素。 – Schwern

回答

0
load data local infile 'c:\a.txt' into table test_table; 

[SQL] 负载数据本地infile的 'C:\ A.TXT' 成表TEST_TABLE; 受影响的行:1000000 时间:12.177s