我有一個MySQL表,看起來像這樣:填充一個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請求並在該表中記錄了我發出請求的時間並收到回覆。
腳本使得這個查詢對status
表:
SELECT id FROM status WHERE lastUpdate < 'XXXX' OR
(responseCode != 200 AND responseCode != 404)
ORDER BY id DESC LIMIT 100
凡XXXX
將在那裏我決定什麼比這日期的需要,無論響應代碼被刷新的日期。此外,我想重新嘗試HTTP請求,如果我沒有得到200
或404
不論上次lastUpdate
日期。我LIMIT
到100,因爲我一次只跑100,然後我睡了一會兒再做100,等等。
不管怎麼說,所有這很好,但我想要做的就是填充表的時間提前與說一系列這樣的:
(1, 503, NOW()), (2, 503, NOW()), (3, 503, NOW()) ... (100000, 503, NOW())
注意,只有ID是遞增的,但它可能不一定從我的需求開始。我想要這樣預先填充表格,因爲那麼上面的查詢可以繼續抓取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表?
增加了一個純粹的SQL解決方案,我的答案,讓你若有發現什麼更快的我知道。 – xception