Tengo una tabla de MySQL que tiene este aspecto:rellenar un MySQL con una gran serie de filas rápidamente
El SQL para crear la estructura es:
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;
almacena una único id
, responseCode
y lastUpdate
. El responseCode
es un código de respuesta HTTP Request: 404, 500, 503, 200, etc.
tengo una URL para corresponder a cada id
para el que hago una petición HTTP y registro en esta tabla el momento que hice la solicitud y la respuesta recibida.
El guión hace que esta consulta en la tabla status
:
SELECT id FROM status WHERE lastUpdate < 'XXXX' OR
(responseCode != 200 AND responseCode != 404)
ORDER BY id DESC LIMIT 100
Dónde XXXX
habría una fecha en que decido que nada más antigua que la fecha debe ser refrescado independientemente del código de respuesta. Además, deseo volver a intentar la solicitud HTTP si no obtuve un 200
o 404
independientemente de la fecha de la última lastUpdate
. I LIMIT
a 100 porque solo corro 100 a la vez, y luego lo tengo dormir por un tiempo y hago otros 100 más adelante, y así sucesivamente.
De todas formas, todo eso está muy bien, pero lo que yo quiero hacer es rellenar la tabla antes de tiempo con decir una serie como esta:
(1, 503, NOW()), (2, 503, NOW()), (3, 503, NOW()) ... (100000, 503, NOW())
Aviso, sólo el ID está incrementando, pero no necesariamente comenzar en 1 para mis necesidades Quiero que la tabla se rellene previamente de esta manera, porque luego la consulta de arriba puede seguir agarrando id
para los que necesitamos volver a intentar, y me gustaría no tener que insertar nada más en la tabla status
como id
's son finitos y no cambiarán (pero hay muchos de ellos).
He intentado utilizar Java, (aunque PHP, C#, o cualquier otra cosa es el mismo concepto y no me importa que el lenguaje que uso aquí):
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!");
Esto inicia los insertos, pero el El problema es que se necesita una cantidad extraordinaria de tiempo para llenar la tabla (no tengo una hora exacta, pero estuvo funcionando durante horas). Entonces, mi pregunta se reduce a: ¿hay una forma fácil y eficiente de llenar una tabla MySQL con una cantidad masiva de filas como esta?
añadió una solución SQL puro a mi respuesta, que me haga saber si encuentras algo más rápido. – xception