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