2015-04-21 16 views
5

Mam tabelę 10000 produktów w mojej bazie danych MySQL. Chciałbym zaktualizować wszystkie rekordy w najszybszy sposób. Używam Laravel z MySQL.Aktualizacja dużej tabeli MySQL

Dla lepszego rozwiązania mogę również zmieniać technologie. Teraz aktualizacja całej tabeli trwa prawie pół godziny.

Chciałbym zaktualizować ten stół w najszybszy sposób. Co powinienem zrobić?

UPDATE

Używam laravel modelu jak poniżej

DB::table('products')->where('product_id',$product_id)->limit(1)->update(array('prodcut_quantity' => $prodcut_quantity)); 
+0

Zaktualizuj je wszystkie w jednym zestawieniu? Jeśli robisz pojedynczą aktualizację na raz, będzie to krwawe na zawsze. – Andrew

+1

Co to jest polecenie aktualizacji, którego używasz? –

+0

Pokaż nam, z jakiego kodu korzystasz, abyśmy mogli Ci pomóc. –

Odpowiedz

1

by utworzyć pętlę dodaje klucza głównego i ilość produktu do tablicy, a następnie wykonać DB::insert i wprowadzić INSERT ON DUPLICATE UPDATE zapytania (na przykład poniżej), zastępując wartości z tymi w tablicach:

$array = array(
    '1,1', //product_id,product_quantity 
    '2,2', 
    '4,12', 
); 

DB::insert('INSERT INTO products (product_id,product_quantity) VALUES (' . implode('),(', $array) . ') ON DUPLICATE KEY UPDATE product_quantity=VALUES(product_quantity)'); 

To zapytanie będzie próbować uzyskać INSERTproduct_id i product_quantity w tabeli products. Ponieważ numer product_id już istnieje, zapytanie zmienia się na UPDATE, a my mapujemy, co chcemy, aby kolumna miała być product_quantity.

+1

Pomimo bycia wybraną odpowiedzią, to podejście ** nie jest ** najszybszym sposobem wykonania aktualizacji przy użyciu Laravel (lub cokolwiek innego). Każdy, kto pochodzi z google i przybywa do tej odpowiedzi, powinien o tym pamiętać. Jest to również kompletny anty-wzór i po prostu dodaje się do niego bez powodu, nie ma nic złego w przeprowadzaniu prostej aktualizacji i pakowaniu wielu z nich w jedną transakcję, aby przyspieszyć (ponieważ w ten sposób tworzymy rzeczy szybciej - używamy jednego wejścia operacja wyjściowa polegająca na zapisaniu dużej ilości danych na dysk, dlatego hdds może pochwalić się pomiarem pasma). –

+0

Dzięki @ N.B. na Twoją odpowiedź. Czy mógłbyś pokazać nam szybciej? –

+0

Jeśli się nie mylę, są dwie odpowiedzi, które podpowiedzą ci, jak zrobić to szybciej. Są też komentarze, które mówią ci, jak zrobić to szybciej. Jeśli łowisz dla rozwiązania kopiuj/wklej, którego możesz użyć - obawiam się, że go nie dostaniesz. –

0

Najlepszym i najszybszym sposobem jest użycie polecenia aktualizacji pojedynczej linii wewnątrz interfejsu zarządzania bazami danych (jak phpmyadmin) w w ten sposób:

UPDATE product SET ... 

Użyłem go na milion re przewód przed i uzyskaj wynik po około 10 sekundach.

+0

Dzięki @hamed za odpowiedź. Czy mówisz o tworzeniu aktualizacji SQL Query za pomocą pętli, a następnie wykonać to zapytanie? –

+0

Nie ma za co. Nie, nie trzeba używać pętli. Możesz zaktualizować tabelę za pomocą ** jednego zapytania ** w interfejsie zarządzania bazami danych (nie wewnątrz twojego projektu). – hamed

+0

Ale chciałbym zaktualizować poprzez mój projekt. –

2

Wydajność jest częściej zależna od projektu tabeli niż od instrukcji, która jest na niego uruchamiana. Upewnij się, że tabela jest poprawnie indeksowana i używa wydajnego mechanizmu magazynowania i upewnij się, że Twoje dane są znormalizowane. Jak wspomniano w komentarzach, upewnij się, że korzystasz z pojedynczego zapytania aktualizacji, a nie wielu (lub przynajmniej z kilku instrukcji, z których możesz korzystać). Jeśli szukasz optymalizacji kodu, musisz napisać trochę, abyśmy mogli z nami pracować. Jeśli mógłbyś opublikować szczegóły twojego projektu stołu, indeksów i mechanizmu magazynowania to też by była pomoc.

Powiązane problemy