Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] masowy INSERT INTO - czym zastąpić?
Forum PHP.pl > Forum > Bazy danych > MySQL
looimaster
Natknąłem się na pewien problem związany z systemem wysyłania wiadomości. Chciałbym dodać na stronę opcję "wiadomość do wszystkich" ale zakładając że na stronie byłoby np. 1000 kont zwykła pętla wykonałaby się 1000 razy za każdym razem dodajć rekord dla poszczególnego konta. Jak zmienić taką pętlę na coś wydajniejszego?

Baza danych: MySQL
Nie mogę oczywiście zrobić oddzielnej tabeli na grupowe wiadomości, bo co się stanie jak jedna osoba to np. usunie? Druga już nie będzie widziała wiadomości. Każdy musi mieć swoją.
Z góry dziękuję za wszelkie pomysły.
phpion
Możesz robić INSERTy w paczkach, tj. zamiast:
  1. INSERT INTO tab (pole) VALUES ("wartosc1");
  2. INSERT INTO tab (pole) VALUES ("wartosc2");
  3. INSERT INTO tab (pole) VALUES ("wartosc3");
  4. INSERT INTO tab (pole) VALUES ("wartosc4");
  5. INSERT INTO tab (pole) VALUES ("wartosc5");
  6. INSERT INTO tab (pole) VALUES ("wartosc6");

zrobić tak (przykładowa paczka zawierająca po 3 wpisy:
  1. INSERT INTO tab (pole) VALUES ("wartosc1"), ("wartosc2"), ("wartosc3");
  2. INSERT INTO tab (pole) VALUES ("wartosc4"), ("wartosc5"), ("wartosc6");

Dzięki temu z 6 zapytań robią się 2. Pamiętaj tylko aby nie przesadzić z liczbą danych wrzucanych za jednym zamachem winksmiley.jpg
specialplan
Jesteś pewny, że taka funkcjonalność to dobry pomysł? Skoro już musisz, zakładając, że tabela z wiadomościami wygląda np tak:
id wiadomosci | id uzytkownika | tresc wiadomosci (uproszczona wersja), to osobiście załadowałbym wszystkie ID użytkowników + treść wiadomości do pliku tekstowego i wrzucił to do bazy za pomocą LOAD DATA INFILE
WAN
Cytat
Pamiętaj tylko aby nie przesadzić z liczbą danych wrzucanych za jednym zamachem winksmiley.jpg

Moglbys to rozwinac? Ile to jest za duzo i od czego to zalezy?
phpion
Ciężko powiedzieć. Zależy jakie dane będziesz wrzucał i do ilu pól. Różnica będzie między liczbą do jednego pola, a np. wypracowaniami z polskiego do 10 pól winksmiley.jpg Wydaje mi się, że taka optymalna paczka powinna zawierać się w przedziale <5, 10> INSERTów.
heaven
Taki przypadek jak Twoj mozna zrobic jednym insert'em. W skrócie to wyglada tak...
  1. INSERT INTO wiadomosci (users_id,wiadomosc) SELECT user_id, 'to jest wiadomosc do wszystkich' FROM users;
webdice
Cytat(heaven @ 10.02.2008, 20:01:52 ) *
Taki przypadek jak Twoj mozna zrobic jednym insert'em. W skrócie to wyglada tak...
  1. INSERT INTO wiadomosci (users_id,wiadomosc) SELECT user_id, 'to jest wiadomosc do wszystkich' FROM users;


Gdzie VALUES, gdzie nawiasy?
heaven
VALUES podajesz jak piszesz konkretne wartosci a tu wartoscią (wartosciami) jest wynik zapytania czyli dwie kolumny (tyle ile trzeba do inserta) z wierszami w ktorych w pierwszej kolumnie jest users_id wszystkich uzytkownikow a w drugiej kolumnie w kazdym wierszu zawsze jest ta sama wiadomosc.

Sprawdz sam na jakims przykladzie...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.