Tôi có một bảng MySQL trông như thế này:cư một MySQL với một loạt lớn các hàng một cách nhanh chóng
SQL để tạo ra cấu trúc là:
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;
Nó lưu trữ một duy nhất id
, responseCode
và lastUpdate
. responseCode
là mã phản hồi Yêu cầu HTTP: 404, 500, 503, 200, v.v.
Tôi có URL tương ứng với mỗi id
mà tôi thực hiện yêu cầu HTTP và ghi lại trong bảng này khi tôi thực hiện yêu cầu và phản hồi nhận được.
Các kịch bản làm cho truy vấn này so với đồng bảng status
:
SELECT id FROM status WHERE lastUpdate < 'XXXX' OR
(responseCode != 200 AND responseCode != 404)
ORDER BY id DESC LIMIT 100
đâu XXXX
sẽ là một ngày mà tôi quyết định rằng bất cứ điều gì lớn hơn ngày mà cần phải được làm mới không phụ thuộc vào mã phản hồi. Hơn nữa, tôi muốn kiểm tra lại yêu cầu HTTP nếu tôi không nhận được 200
hoặc 404
bất kể ngày lastUpdate
vừa qua. Tôi LIMIT
đến 100 bởi vì tôi chỉ chạy 100 tại một thời điểm, và sau đó tôi có nó ngủ trong một thời gian và làm khác 100 sau đó, và như vậy.
Anyways, tất cả những gì tốt đẹp, nhưng những gì tôi muốn làm là cư bàn trước thời hạn với nói một loạt như thế này:
(1, 503, NOW()), (2, 503, NOW()), (3, 503, NOW()) ... (100000, 503, NOW())
Chú ý, chỉ có ID được incrementing, nhưng nó có thể không nhất thiết phải bắt đầu từ 1 cho nhu cầu của tôi. Tôi muốn bảng được điền trước như thế này, bởi vì sau đó truy vấn ở trên có thể tiếp tục lấy các số id
của những người chúng ta cần phải kiểm tra lại và tôi không muốn chèn thêm bất kỳ thứ gì vào bảng status
dưới dạng id
's là hữu hạn và sẽ không thay đổi (nhưng có nhiều người trong số họ).
tôi đã cố gắng sử dụng JAVA, (mặc dù PHP, C#, hoặc bất cứ điều gì khác là khái niệm tương tự và không quan trọng với tôi mà ngôn ngữ tôi sử dụng ở đây):
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!");
này bắt đầu chèn, nhưng vấn đề là phải mất một số lượng thời gian bất thường để điền vào bảng (tôi không có thời gian chính xác, nhưng nó đã chạy hàng giờ). Vì vậy, câu hỏi của tôi sôi xuống: là có một cách dễ dàng và hiệu quả để cư một bảng MySQL với một số lượng lớn các hàng như thế này?
Added một giải pháp sql tinh khiết để trả lời của tôi, cho tôi biết nếu bạn tìm thấy bất cứ điều gì nhanh hơn. – xception