2011-11-21 14 views
18

W mojej bazie danych MySQL znajduje się tabela zawierająca 2 000 000 rekordów. Teraz chciałbym wstawić do tej tabeli kolejne 6 000 000 nowych rekordów.Klucze wyłączania i włączania MySQL

Aby przyspieszyć wprowadzenie, I choć powinienem użyć włączyć/wyłączyć klawisze jak następuje:

ALTER TABLE cars DISABLE KEYS; 

INSERT INTO cars ... 
... 
... 
INSERT INTO cars ... 

ALTER TABLE search_all_values ENABLE KEYS; 

OPTIMIZE TABLE cars; 

Ale jakoś poczuć tym, włączyć/wyłączyć klawisze byłoby bardziej sensowne, aby być wykorzystywane do pustej tabeli wprowadzenie.

Podczas gdy w moim przypadku mam już 2 000 000 rekordów w tabeli, gdy ENABLE KEYS, mysql ponownie utworzy wszystkie indeksy (w tym istniejące rekordy i nowe dodane rekordy), co prawdopodobnie nie spowoduje wydajnego wstawienia danych jako całość w moim przypadku. Jak odtworzyć wszystkie indeksy zajmie długo i prawdopodobnie tak robi OPTIMIZE TABLE

chciałbym zapytać o opinię mam rację i jak mogę mieć wprowadzania danych efficent w moim przypadku?

+0

Czy jesteś pewien, że kluczowa aktualizacja jest wąskim gardłem? – abcde123483

+1

To jest moje zmartwienie i jest ktoś, kto ma takie same obawy tutaj http://forums.mysql.com/read.php?21,68820,68939#msg-68939 – Mellon

+0

W każdym razie te indeksy zostaną utworzone po ponownym włączeniu ich ponownie . Spróbuj wstawić wstawkę zamiast wiersza/wiersza, a także zrobić statystyki aktualizacji i sprawdzić, czy to coś poprawia. – Rahul

Odpowiedz

1

Indeksowanie nowych kluczy zajmie trochę czasu. To Ty decydujesz, czy chcesz, aby wszystko zostało zrobione od razu (najpierw wyłączając je), czy pojedynczo (zachowując je tak, jak to jest i pozwalając na indeksowanie podczas dodawania każdego rekordu).

Ja " idź na to drugie, nie wyłączając kluczy. Jeśli obawiasz się zbytniego obciążania serwera, możesz spróbować wstawić w partiach, np. tylko pewna ilość wstawek na minutę.

+0

@ mlitn, jak o optymalizacji tabeli po wstawieniu danych, czy ten krok jest konieczny? – Mellon

39

Zdecydowanie musisz wybrać swoje podejście w zależności od typu silnika ... optymalizując for MyISAM lub for InnoDB.

Niedawno przeprowadziliśmy test porównawczy, porównując różne sposoby wstawiania danych i mierząc czas sprzed wstawienia, aż do pełnego przywrócenia wszystkich indeksów. To było na pustym stole, ale użyliśmy do 10 milionów wierszy.

MyISAM z i ALTER TABLE ... ENABLE/DISABLE KEYS zwyciężył w naszym teście (na systemie Windows 7, MySQL 5.5.27 - teraz próbujemy go w systemie Linux).

Klawisze ENABLE i DISABLE KEYS nie działają dla InnoDB, tylko MyISAM. W przypadku InnoDB użyj SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;, jeśli masz pewność, że twoje dane nie zawierają duplikatów (nie zapomnij ustawić ich na 1 po zakończeniu przesyłania).

Nie sądzę, że potrzebujesz OPTIMIZE TABLE po wstawieniu luzem - wiersze MySQL są sortowane przez wstawienie, a indeks jest mimo wszystko przebudowywany. Nie ma "dodatkowej fragmentacji", wykonując wkładkę luzem.

Zapraszam do komentowania, jeśli popełniłem błędy merytoryczne.

AKTUALIZACJA: Zgodnie z naszymi nowszymi i pełnymi wynikami testów, porady dotyczące kluczy WYŁĄCZ/AKTYWUJ są nieprawidłowe.

Współpracownik miał program uruchomić wiele różnych testów - stół z InnoDB/MyISAM fabrycznie wypełniony i pusty, selekcji i przyspiesza wstawkami z LOAD DATA LOCAL, INSERT INTO, REPLACE INTO i UPDATE na „gęste” i „rozdrobnionych” stołach (jestem nie do końca pewny jak, myślę, że to było na linii DELETE FROM ... ORDER BY RAND() LIMIT ... ze stałym nasieniem, więc wciąż jest porównywalne) i włączonymi i diasabled indeksami.

Testowaliśmy to z wieloma różnymi wersjami MySQL (5.0.27, 5.0.96, 5.1.something, 5.5.27, 5.6.2) w systemach Windows i Linux (jednak nie w obu wersjach systemu operacyjnego). MyISAM wygrał tylko wtedy, gdy stół był pusty. InnoDB był szybszy, gdy dane były już obecne i ogólnie wykonywane lepiej (z wyjątkiem przestrzeni dyskowej Hdd - MyISAM jest mniejszy na dysku).

Mimo to warto to przetestować samodzielnie - z różnymi wersjami, różnymi ustawieniami konfiguracyjnymi i dużą cierpliwością - szczególnie w odniesieniu do dziwnych niespójności (5.0.97 był dużo szybszy niż w wersji 5.5.27 ta sama konfiguracja - wciąż szukamy przyczyny). To, co znaleźliśmy, to:, z których DISABLE KEYS i ENABLE KEYS są bezwartościowe, a czasem szkodliwe, jeśli nie zaczynasz od pustej tabeli.

+1

To naprawdę fantastyczna odpowiedź. Dziękuję za dokładne badania! – pinkgothic

+0

Hmm, dobry wysiłek, ale wątpiłbym w konkluzję, skoro wielkie różnice w wynikach testów wskazują, że jest tu ** dużo ** nieznanych czynników? – Pacerier

Powiązane problemy