![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 38 Pomógł: 0 Dołączył: 8.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Czy macie jakiś pomysł, na optymalizacje tego zapytania? Generalnie projekt dotyczy naszej klasy (eksportu znajomych - www.znajomi.boo.pl) i ten kawałek skryptu wygląda tak - po pobraniu danych z listy znajomych, wrzuca je w tabele tymczasową i w pętli za każdy kolejny rekord porównuje, czy istnieje już w tabeli docelowej, czy nie (jeśli istnieje, to robi UPDATE, jeśli nie istnieje, to INSERT). Problem w tym, że najczęściej korzystają z tego osoby, które mają dużo znajomych i przy liczbie kilkuset pojawia się problem zasobochłonności. Kod $pyt="INSERT INTO tablela_tymczasowa SET id_zn='$id', dane='$imie', miasto='$miasto', profil='$numer'"; mysql_query($pyt); // sprawdzanie czy rekordy juz sa - jesli nie, dodaje, jesli tak - aktualizuje $pyt=mysql_query("SELECT * FROM $tabela_docelowa WHERE id_zn='$id' AND profil='$numer'"); if(!mysql_fetch_row($pyt)) { $pyt="INSERT INTO $tabelank SET id_zn='$id', dane='$imie', miasto='$miasto', profil='$numer'"; mysql_query($pyt); } else { $staryid=$pyt['id']; $pyt="UPDATE $tabelank SET id_zn='$id', dane='$imie', miasto='$miasto', profil='$numer' WHERE id='$staryid'"; mysql_query($pyt); i powtarza się ten cykl zapytań dla każdego kontaktu, czyli nawet kilkaset razy (w pętli while). Domyślam się, że nie jest to optymalne, skoro różne serwery sobie z tym nie radzą (chyba tylko na home.pl było z tym OK). Generalnie mam jeszcze drugi problem, związany też z MySQL, chodzi o szukanie wspólnych znajomych w dwóch profilach na naszej klasie - tutaj też używam tablicy tymczasowej i wymodziłem takie zapytanie Kod $pyt=mysql_query("SELECT * FROM tablica_docelowa WHERE tablica_docelowa.id_zn IN (SELECT tablica_tymczasowa.id_zn FROM tablica_tymczasowa WHERE tablica_tymczasowa.profil='$numer') && tablica_docelowa.profil='$g_numer'"); (przy czym to już idzie normalnie, nie w pętli). Kilka wyjaśnień odnosnie struktury: id_zn - jest to numer profilu znajomego na naszej klasie profil - numer profilu, z którego eksportowane są kontakty Ten post edytował torbicki65 28.12.2008, 15:20:41 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 952 Pomógł: 154 Dołączył: 20.01.2007 Skąd: /dev/oracle Ostrzeżenie: (0%) ![]() ![]() |
Odnośnie pierwszego problemu, polecam zapoznać się ze składnią INSERT .... ON DUPLICATE KEY UPDATE automatycznie wykonującą wszystkie te testy na obecność rekordu, który teraz próbujesz robić ręcznie. Dokładniejszy opis znajdziesz tutaj: http://dev.mysql.com/doc/refman/5.0/en/ins...-duplicate.html
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 13.10.2025 - 07:23 |