MySQL optymalizuje prędkość INSERT dzięki spowolnieniu indeksów
Dokumenty MySQL mówić :
Rozmiar tabeli spowalnia wstawianie indeksów przez log N, zakładając indeksy drzewa B.
Czy to oznacza, że przy wstawianiu każdego nowego wiersza prędkość wstawiania zostanie spowolniona o współczynnik log N, gdzie N, zakładam, że jest to liczba wierszy? nawet jeśli wstawię wszystkie wiersze w jednym zapytaniu? tj .:
INSERT INTO mytable VALUES (1,1,1), (2,2,2), (3,3,3), .... ,(n,n,n)
Gdzie n wynosi ~ 70 000
Obecnie mam ~ 1,47 miliona wierszy w tabeli o następującej strukturze:
CREATE TABLE mytable (
`id` INT,
`value` MEDIUMINT(5),
`date` DATE,
PRIMARY_KEY(`id`,`date`)
) ENGINE = InnoDB
Kiedy wstawiam wyżej wymienioną modę do transakcji, czas zatwierdzenia wynosi ~ 275 sekund. Jak mogę to zoptymalizować, ponieważ nowe dane mają być dodawane codziennie, a czas wstawiania będzie po prostu zwalniał.
Czy jest coś poza pytaniami, które mogą pomóc? może jakieś ustawienia konfiguracji?
Możliwa metoda 1 - Usuwanie indeksówCzytałem, że usunięcie indeksów tuż przed wstawieniem może pomóc w wprowadzeniu szybkości. A po wstawkach ponownie dodaję indeks. Ale tutaj jedyny indeks jest kluczem podstawowym, a usunięcie go nie pomoże moim zdaniem. Ponadto, podczas gdy kluczem podstawowym jestporzucone , wszystkie wybrane zapytania będą powolne.
Nie znam żadnych innych możliwych metod.
Edytować : Oto kilka testów wstawiania ~ 60 000 wierszy w tabeli z ~ 1,47 mil wiersza:
Używając zwykłego zapytania opisanego powyżej: 146 sekund
Korzystanie z infile LOAD DATA MySQL: 145 sekund
Korzystanie z infile LOAD DATA MySQL i dzielenie plików csv zgodnie z sugestią Davida Jashi w jego odpowiedzi: 136 sekund dla 60 plików po 1000 wierszy każdy, 136 sekund dla 6 plików po 10 000 wierszy każdy
Usuwanie i ponowne dodawanie klucza podstawowego: usunięcie klucza zajęło 11 sekund, 0,8 sekundy na wstawienie danych, ALE 153 sekundy na ponowne dodanie klucza podstawowego, co zajęło ~ 165 sekund