Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: 1 rozbudowane zapytanie czy wiele pojedynczych
Forum PHP.pl > Forum > Bazy danych > MySQL
lexis72
Witam,
Zrobilem skrypt ktory poprawia mi wczesniej dodane wyniki tak jak tego chce ale z racji niskich umiejetnosci w temacie MySQL zrobilem to dosc prymitywnym sposobem tworzac kilkanascie/kilkadziesiat praktycznie takich samych zapytan rozniacych sie tylko 1 szczegolem. Czy przy malej ilosci wynikow i czestotliwosci korzystania z tego skryptu ma to jakies wieksze znaczenia w obciazeniu bazy i powinienem to wpakowac wszystko do 1 zapytania czy poza wzlgedami estetycznymi i powiekszonym o kilkanascie linijek pliku nie ma to znaczenia czy operacje beda wykonywane 1 zapytaniem czy zostanie to podzielone na kilkanascie?

  1. $a1 = dbquery("SELECT MIN(wynik) AS wynik FROM ".DB_WYNIKI." WHERE argument=".$_GET['argument_id']."");
  2. $data = dbarray($a1);
  3. $b1 = dbquery("UPDATE ".DB_WYNIKI." SET miejsce=1 WHERE argument=".$_GET['argument_id']." AND wynik=".$data['wynik']."");
  4.  
  5. $a2 = dbquery("SELECT wynik AS wynik FROM ".DB_WYNIKI." WHERE argument=".$_GET['argument_id']." ORDER BY wynik ASC LIMIT 1,1 ");
  6. $data = dbarray($a2);
  7. $b2 = dbquery("UPDATE ".DB_WYNIKI." SET miejsce=2 WHERE argument=".$_GET['argument_id']." AND wynik=".$data['wynik']."");
  8.  
  9. $a3 = dbquery("SELECT wynik AS wynik FROM ".DB_WYNIKI." WHERE argument=".$_GET['argument_id']." ORDER BY wynik ASC LIMIT 2,1 ");
  10. $data = dbarray($a3);
  11. $b3 = dbquery("UPDATE ".DB_WYNIKI." SET miejsce=3 WHERE argument=".$_GET['argument_id']." AND wynik=".$data['wynik']."");
  12.  
  13. ... itd x10
bpskiba
Ta kwestia ma bardzo istotne znaczenie!
Wydajność takiej bazy będzie spadać w niesamowitym tempie wraz ze wzrostem liczby rekordów.
Obowiązkowo pracuj nad tym businesssmiley.png
pmir13
Podstawowe pytanie - czy na pewno potrzebujesz trzymać miejsca w bazie danych? Przecież można bardzo szybko uzyskać aktualne dane z bazy kiedy tylko je potrzebujesz:

  1. SELECT id_zawodnika, wynik FROM wyniki WHERE id_konkurencji = 1234 ORDER BY wynik


Takie zapytanie daje nam całą listę dla danej konkurencji, posortowaną wg wyników. Przy indeksie (id_konkurencji, wynik,id_zawodnika ) będzie to działać natychmiast nawet na całkiem sporej bazie danych.
Trzymanie w bazie miejsca ma dość poważną wadę - za każdym razem gdy dojdzie nowy rekord trzeba uaktualnić wszystkie miejsca dla tej konkurencji.
Poza tym jeśli już faktycznie musisz je trzymać to lepiej w osobnej tabeli, a na tabeli, do której wpisujesz wyniki utworzyć trigger, który robi update miejsc.
A jeśli już bardzo, ale to bardzo musisz mieć tak jak podajesz to lepiej zebrać całość posortowanych wyników dla danej konkurencji jednym zapytaniem do tablicy w php i złożyć w pętli jedno większe zapytanie z update, korzystając z konstrukcji CASE WHEN.
lexis72
PMIR13 pomieszales strasznie tongue.gif

To co najbardziej chcialem sie dowiedziec to to czy na podanym wyzej przykladzie jest jakas roznica w wydajnosci miedzy pobieranie czy wysylanie danych w jednym zapytaniu a dzieleniu go na kilka innych prostych czyli np :

Update X Set Y=B where A
Update X Set Y=D where B
Update X Set Y=F where C

czy lepiej zrobic jeden skomplikowany Update ktory za 1 razem by wszystko aktualizowal. Ciekawi mnie to rowniez dlatego ze w innych plikach czesto stosuje podobną zagrywke jak juz moje zapytanie jest zbyt skomplikowane i nie jest w stanie dalej do niego dodawac polecen a moge je zamknac i otworzyc nastepne to tak robie. I w konsekwenji na jakies stronie w ktore pobierane sa wyniki z bazy zamiast jednego SELECT ktore pobieraloby wszystkie dane ktore chce mam po kilka czy nawet kilkanscie.


Jesli chodzi o trzymanie 'miejsca' w bazie danych to faktycznie nie jest ono wymagane aczkolwiek bardzo duzo razy potrzebuje sprawdzic ktore miejsce ma dany wynik lub ile razy np dany uzytkownik mial wynik z miejsce 1, 2 czy 3. I wtedy wystarczy mi zrobic prosty select na konkretne miejsce niz bawic sie w zapytania liczace ile razy dany wynik byl ktoryms tam z kolei. Dlatego mimo wszystko malym obciazeniem bazy to tylko jedna kolumna z z liczba mam ulatwiony dostep do tej informacji. A update ktory zmuszony jestem robic wynika z tego ze jak dodaje co jakis czas wyniki do tego samego argumentu to kolejnosc tych wynikow sie zmienia i wynik ktore jeszcze niedawno byl najmniejszy moze juz byc 2 albo 3. Gdyby to byla kwestia tylko wyswieltania tych wynikow to nie problem zrobic sortowanie i wsywietlenie tego z kolei wyniku ktory chce ale jak juz robie cos w rodzaju statystyk ukazujacych jak wiele razy jakis uzytkownik ma miejsce 1 czy 2 to juz sie to przyadaje.

A chcialbym jeszcze tylko dodac by Cie uspokoic PMIR13 ze to nie dla danej konkurencji sa aktualizowane wyniki co by sugerowalo ze dla tej konkurencji moga byc tysiace wynikow i te tysiace trzeba aktualizowac za kazdym razem. Te wyniki sa dzielone na grupy - argumenty i moze w nich byc maksymalnie 30 wynikow dla danego argumentu i potem towrzony jest nastepny argument. Argumenty sa w osobnej bazie i maja swoje id wiec dodajac wyniki automatycznie jest pobierany argument i tylko dla niego jest ta aktualizacja pozostale wyniki w bazie nie sa ruszane.
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.