Skrypt, nad którym pracuję, ma na celu aktualizację tabeli bazy danych, która rejestruje kraj użytkowania i status wszystkich adresów IP (lub prawie wszystkich z nich). Obecnie utrzymuję to w prostocie i gromadzę tylko dane z 5 RIR-ów (regionalne rejestry internetowe) i zapisuję je w mojej bazie danych.Zmienność szybkości wstawiania SQL
Początkowo prędkości były niepraktyczne, ale zostały poprawione w znaczący sposób poprzez zmniejszenie ilości informacji w dzienniku i grupowanie wstawek SQL w grupy o wartości 1000 i za pomocą pojedynczego zapytania. Jednak po uruchomieniu skryptu dostaję bardzo duże różnice w szybkości wstawiania SQL i zastanawiałem się, czy ktoś wie dlaczego.
Oto niektóre z prędkości, które zarejestrowałem. W teście wyodrębniłem czas potrzebny do wykonania iteracji skryptu w PHP i czasu potrzebnego do zastosowania instrukcji sql, ale nie uwzględniłem czasów PHP na poniższej liście, ponieważ efekt był znikomy; nie więcej niż 1 sekunda dla nawet największych bloków danych.
Badanie Szybkości (liczba wierszy danych są wstawiane pozostaje w całym opisie)
Test 1 Całkowita SQL czas uruchamiania: 33 sekund
Test 2 Całkowita SQL czas uruchamiania: 72 sekund
Test 3 Tota l Czas wykonywania SQL: 78 sekund
Inne testy trwały od około 30 sekund do około 80 sekund.
Mam dwa pytania:
1) Czy mogę przyjąć tych różnic jako sposobu na świecie, czy jest jakiś powód, dla nich?
2) Byłem zdenerwowany z powodu wstawienia ~ 185000 rzędowych wstawek w jedno zapytanie. Czy jest jakikolwiek powód, dla którego powinienem unikać jednego zapytania dla tych wstawek? Nie pracowałem z tą ilością danych zapisywaną jednorazowo.
Dziękuję
__
tabela bazy danych jest następująca.
Sorage Engine - InnoDB
Kolumny:
id - int, klucz podstawowy
rejestru - varchar (7)
code - varchar (2)
typ - varchar (4)
start - varchar (15)
wartość - int
data - datetime
status - varchar (10)
Istnieje konfigurowalna maksymalna długość dla poleceń w MySQL - standard wynosi 1 MB. Z 185 tysiącami wierszy możesz trafić w ten limit. Możesz go oczywiście podnieść i nie wiem, dlaczego nie powinieneś. – Argeman
Zakładam, że używasz standardowego typu tabeli innodb? – Argeman
80 sekund na wstawkę, nawet 1000 wierszy, brzmi bardzo długo. Często włamuję się do grup po 100 i zdarza się to wystarczająco szybko ("natychmiast"), że nigdy się nie martwiłem - spodziewałbym się podobnego z 1000 rzędów. Czynniki, które mogą spowolnić działanie - ruch sieciowy (ale nie działa po 80 sekundach), zbyt wiele indeksów (ponownie, nie uwzględniają wystarczającej ilości czasu) i wyzwalacze (czy masz jakieś?). Ale powinieneś dostawać dużo, dużo szybciej - kopałbym głębiej. Ale porównaj 100 vs 1000 vs 10 000 zanim zaczniesz pulchować! – Robbie