私はMySQLインデックスでいくつかのテストをしたいと思っています。さまざまな種類のインデックス(カバリング、クラスタリング)が異なるクエリに及ぼす影響を試してみたいと思っています。MySQLで10億行のテストテーブルを作成するにはどうすればよいですか?
私は3つのcol、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);
しかし、今では約16万行を持っていますが、それがパラメータとして1とそれを実行する分のようになりますので、私はもう、この機能を実行することはできません、一度倍増する分かかり、次の倍増は2分などを取ります私はどのようにして10億倍速くすることができますか?
またSELECT COUNT(*) FROM test_table;
はあまりにも本当に遅いです。テーブルのサイズを確認するためにこれをどのように高速化できますか?
インデックスを削除してください。後でそれらを再作成する。 – Schwern
テーブルにはまだインデックスがありません。 – Alex
'コールtest_procedure(10000);' 1.8秒を要し、 'コールtest_procedure(100000);' 18秒かかりました、と 'コールtest_procedure(1000000);'私の2011年のMacBookに172秒を要しました。それは予想どおり線形に拡大しているように見えるので、10億は約1800秒かかるはずです。あなたはどんな時を見ていますか?私はSSDを持っているので、I/Oは非常に速く、それは大きな要因かもしれません。 – Schwern