Mam tabeli MySQL, które wygląda następująco:wypełnić MySQL z dużej serii wierszy szybko
SQL do tworzenia struktury jest:
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;
To przechowuje unikalne id
, responseCode
i lastUpdate
. responseCode
jest kod odpowiedzi HTTP Żądanie: 404, 500, 503, 200, itd.
Mam URL musi odpowiadać każdemu id
dla którego robię żądanie HTTP i rekord w tabeli czas zrobiłem żądanie i otrzymana odpowiedź.
Skrypt czyni to zapytanie na stole status
:
SELECT id FROM status WHERE lastUpdate < 'XXXX' OR
(responseCode != 200 AND responseCode != 404)
ORDER BY id DESC LIMIT 100
Gdzie XXXX
byłoby datę gdzie decydowania że cokolwiek starszy od tej daty musi być odświeżane niezależnie od kodu odpowiedzi. Co więcej, chcę ponownie sprawdzić żądanie HTTP, jeśli nie dostałem 200
lub 404
niezależnie od ostatniej daty lastUpdate
. I LIMIT
do 100, ponieważ uruchamiam tylko 100 na raz, a potem mam to przez jakiś czas przespać i zrobić kolejne 100 później, i tak dalej.
Tak czy inaczej, to wszystko jest w porządku, ale to, co chcę zrobić, to wypełnić tabelę z wyprzedzeniem z powiedzieć seria tak:
(1, 503, NOW()), (2, 503, NOW()), (3, 503, NOW()) ... (100000, 503, NOW())
Wskazówka jedynie identyfikator jest zwiększany, ale niekoniecznie zacznij od 1 dla moich potrzeb. Chcę, aby tabela była już wypełniona, ponieważ wtedy powyższe zapytanie może nadal przyciągać id
za te, które musimy ponownie sprawdzić, i nie chciałbym nigdy więcej wstawiać do tabeli status
jako id
są skończone i nie ulegną zmianie (ale jest ich wiele).
Próbowałem za pomocą Java, (choć PHP, C#, lub czegokolwiek innego, co jest samo pojęcie i nie ma dla mnie znaczenia w jakim języku używam tutaj):
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!");
Zaczyna wkładki, ale Problem polega na tym, że wypełnienie stołu zajmuje bardzo dużo czasu (nie mam dokładnego czasu, ale trwało to wiele godzin). Moje pytanie sprowadza się do: czy istnieje łatwy i skuteczny sposób wypełniania tabeli MySQL masą takich wierszy?
dodał czystego roztworu sql do mojej odpowiedzi, daj mi znać jeśli znajdziesz coś szybciej. – xception