Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> 1 rozbudowane zapytanie czy wiele pojedynczych
lexis72
post
Post #1





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 25.02.2013

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
bpskiba
post
Post #2





Grupa: Zarejestrowani
Postów: 340
Pomógł: 49
Dołączył: 3.07.2009
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
pmir13
post
Post #3





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
lexis72
post
Post #4





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 25.02.2013

Ostrzeżenie: (0%)
-----


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.

Ten post edytował lexis72 28.04.2013, 12:01:13
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 05:03