2017-03-07 42 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