私は次のようなMySQLテーブルを持っています:
構造を作成するSQLは次のとおりです。
CREATE TABLE `status` (
`id` INT(11) NOT NULL,
`responseCode` INT(3) NOT NULL DEFAULT '503',
`lastUpdate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
id
一意の、、、responseCode
およびを格納しlastUpdate
ます。これresponseCode
はHTTPリクエストの応答コードです:404、500、503、200など。
HTTPリクエストを行うそれぞれに対応するURLがありid
、リクエストを行った時間と受信した応答をこのテーブルに記録します。
スクリプトは、status
テーブルに対して次のクエリを実行します。
SELECT id FROM status WHERE lastUpdate < 'XXXX' OR
(responseCode != 200 AND responseCode != 404)
ORDER BY id DESC LIMIT 100
XXXX
応答コードに関係なく、その日付より古いものを更新する必要があると私が判断した日付はどこにありますか。さらに、最後の日付に関係なく、200
またはを取得しなかった場合は、HTTPリクエストを再試行したいと思います。一度に100を実行するだけなので、100になります。その後、しばらくスリープしてから、さらに100を実行します。404
lastUpdate
LIMIT
とにかく、それはすべて問題ありませんが、私がやりたいのは、次のようなシリーズを事前にテーブルに入力することです。
(1, 503, NOW()), (2, 503, NOW()), (3, 503, NOW()) ... (100000, 503, NOW())
IDのみが増分していることに注意してください。ただし、私のニーズでは必ずしも1から始まるとは限りません。このようにテーブルを事前に入力しておく必要があります。これは、上記のクエリで、id
再試行する必要のあるものを取得し続けることができるためです。また、テーブルにはこれ以上何も挿入する必要がないため、status
テーブルid
は有限であり、変更されません(ただし、それらの多くがあります)。
私はJAVAを使用してみました(ただし、PHP、C#、またはその他のものは同じ概念であり、ここで使用する言語は関係ありません):
PreparedStatement st = conn.prepareStatement("INSERT INTO status VALUES (?,default,default)");
for( int i = 1; i <= 100000; i++ ) {
st.setInt(1,i);
st.addBatch();
}
System.out.println( "Running batch..." );
st.executeBatch();
System.out.println( "Batch done!" );
これにより挿入が開始されますが、問題は、テーブルにデータを入力するのに非常に長い時間がかかることです(正確な時間はわかりませんが、何時間も実行されていました)。つまり、私の質問は次のように要約されます。MySQLテーブルにこのような大量の行を入力する簡単で効率的な方法はありますか?