Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pomoc w optymalizacji zapytań
Forum PHP.pl > Forum > Bazy danych > MySQL
Balon
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!
dr_bonzo
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/
Balon
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!
Sedziwoj
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ń.
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.