Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Pomoc w optymalizacji zapytań
Balon
post 5.06.2008, 06:21:43
Post #1





Grupa: Zarejestrowani
Postów: 422
Pomógł: 0
Dołączył: 14.12.2005
Skąd: Wałbrzych

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


Otóż piszę pewną aplikację opartą o ZF. Miałem problemy z wydajnością, więc podpiąłem Profilera i okazało się, że mam problem z następującymi zapytaniami:

Query length: 0.000461101531982
Query:
  1. SELECT `files`.* FROM `files` WHERE (id > '156847') ORDER BY `id` ASC LIMIT 1


Query length: 0.000448942184448
Query:
  1. SELECT `files`.* FROM `files` WHERE (id < '156847') ORDER BY `id` DESC LIMIT 1


Query length: 1.26994109154
Query:
  1. SELECT `files`.* FROM `files` WHERE (id <> '156847') ORDER BY RAND() ASC LIMIT 5


Te dwa raz działają dobrze, a raz źle. A ostatnie działa zawsze źle. Pierwsze dwa służą do pobrania ID poprzedniego i następnego rekordu, a ostatni służy do pobrania losowych rekordów.

Ja nie wyobrażam sobie napisania tego w inny sposób, co Wy o tym sądzicie?

Pozdrawiam!

Ten post edytował Balon 5.06.2008, 06:21:55


--------------------
Postura wielka i morda wredna, jestem Balon, kozak z osiedla !
bzdury.pl - Królestwo rozrywki
Go to the top of the page
+Quote Post
dr_bonzo
post 5.06.2008, 06:39:00
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


1. Zawsze podawaj strukture tabeli [koniecznie z kluczami]
2. W pierwszych 2ch przypadkach szukasz pierwszego rekordu i porownujesz jego ID [zakladam ze MASZ na nim indeks, czy tez PK] - wiec to bedzie szybkie bo skorzysta z indeksu do znalezienia odpowiedniego ID i zapewne tez do posortowania rekordow
3. Co robi ostatnie zapytanie?
Wyciaga wszystkie rekordy [oprocz jednego] i je sortuje [order by RAND()], i nie skorzysta z indeksow [obejrzyj sobie wynik EXPLAIN] - chyba widzisz roznice smile.gif

Tu masz ladny art. o tym jak wybierac losowy rekord: http://akinas.com/pages/en/blog/mysql_random_row/


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Balon
post 6.06.2008, 13:38:08
Post #3





Grupa: Zarejestrowani
Postów: 422
Pomógł: 0
Dołączył: 14.12.2005
Skąd: Wałbrzych

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


Tak, fakt. Rozumiem czemu to tak działa w 3. Co do przykładów, do których link podałeś, jak mam zrobić, żebym mógł pobierać wiele losowych rekordów? Bo to co jest tam pokazane tyczy się jedynie jednego rekordu. A ja potrzebuje pobrać 5 różnych.

Dziękuje za odpowiedź,
pozdrawiam!


--------------------
Postura wielka i morda wredna, jestem Balon, kozak z osiedla !
bzdury.pl - Królestwo rozrywki
Go to the top of the page
+Quote Post
Sedziwoj
post 9.06.2008, 09:13:50
Post #4





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Możesz wybrać grupę np. 20 rekordów, wybierając przedział losowo (jedynie początek wystarczy losowo wybrać), a z tej grupy po rand() te 5, co prawda to spowoduje że będą występować tylko blisko siebie dane, ale da to złudzenie losowości, jeszcze można co najwyżej wykorzystać indeksowane kolumny do różnych sortowań.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
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 Wersja Lo-Fi Aktualny czas: 23.04.2024 - 14:00