我有一个如下所示的 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 等。
我有一个 URL 对应于id
我发出 HTTP 请求的每个 URL,并在此表中记录我发出请求和收到响应的时间。
该脚本对status
表进行此查询:
SELECT id FROM status WHERE lastUpdate < 'XXXX' OR
(responseCode != 200 AND responseCode != 404)
ORDER BY id DESC LIMIT 100
我决定无论响应代码如何XXXX
,都需要刷新比该日期更早的任何日期。此外,如果我没有得到200
或404
不管最后lastUpdate
日期,我想重新尝试 HTTP 请求。我LIMIT
选择 100 次,因为我一次只运行 100 次,然后我让它休眠一段时间,然后再运行 100 次,依此类推。
无论如何,一切都很好,但我想要做的是提前填充表格,说一个像这样的系列:
(1, 503, NOW()), (2, 503, NOW()), (3, 503, NOW()) ... (100000, 503, NOW())
请注意,只有 ID 在递增,但根据我的需要,它可能不一定从 1 开始。我希望像这样预先填充表格,因为上面的查询可以继续抓取id
我们需要重新尝试的表格,并且我不想在status
表格中插入更多内容,因为id
's 是有限的并且不会改变(但有很多)。
我尝试使用 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 表?