Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MYSQL] LOSOWY REKORD, szukam sposobu bardziej wydajnego niż RAND()
lysy2005
post
Post #1





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 18.01.2009

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


Witam,
mam bazę 4 GB i chce pobrać losowy rekord spełniające moje kryteria.

Teraz mam zastosowanie:
Select pole FROM tabela WHERE pole='1' ORDER BY RAND(); LIMIT 1

Ale wykorzystując RAND() zapytanie trwa bardzo długo,
przy dużych bazach nie spełnia roli.
W jaki sposób wy wyciągacie losowe rekordy w takich dużych bazach?
Z góry dziękuje za pomoc
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Speedy
post
Post #2





Grupa: Zarejestrowani
Postów: 651
Pomógł: 28
Dołączył: 4.12.2004

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


Możesz zrobić tak:

  1. SELECT id
  2. FROM tabela
  3. WHERE (tabela.id = (SELECT FLOOR(1 + (RAND() * ((SELECT COUNT(id) FROM tabela) - 1) ))))
  4. LIMIT 1;


To zapytanie wylosuje jedną liczbę od 1 do N, gdzie N, to liczba rekordów w Twojej tabeli a następnie zwróci rekord o podanym ID.
To rozwiązanie ma tą wadę, że jeśli rekordy są niespójne (nie ma ciągłości identyfikatorów ID) i część z nich jest usunięta, to wtedy zapytanie czasem zwróci pusty wynik (NULL).
Można to spróbować jakoś rozwiązać w SQL-u, albo pójść na łatwiznę i w aplikacji webowej możesz zrobić pętlę do ... while, w której wykonasz to zapytanie raz jeszcze, gdy zwróci wartość NULL.
Jeśli nieciągłość w identyfikatorach ID jest mała, rozwiązanie powinno się sprawdzić. Jeśli natomiast rozbieżność jest duża, może to działać bardzo wolno.
Tak czy inaczej, powyższe zapytanie działa szybciej, niż ... ORDER BY RAND() choć jest mniej stabilne.

Ten post edytował Speedy 18.06.2011, 14:55:28
Go to the top of the page
+Quote Post

Posty w temacie
- lysy2005   [PHP][MYSQL] LOSOWY REKORD   18.06.2011, 12:48:03
- - matino   Tutaj masz bardzo przydatny link: http://net.tutsp...   18.06.2011, 12:56:11
- - lysy2005   Cytat(matino @ 18.06.2011, 13:56:11 )...   18.06.2011, 13:11:06
- - Hpsi+   Aż mi sie nie chce wierzyć że: [SQL] pobierz, pla...   18.06.2011, 13:17:25
|- - webdice   Cytat(Hpsi+ @ 18.06.2011, 14:17...   18.06.2011, 14:32:39
- - lysy2005   Cytat(Hpsi+ @ 18.06.2011, 14:17...   18.06.2011, 13:43:52
- - Speedy   Możesz zrobić tak: [SQL] pobierz, plaintext SELEC...   18.06.2011, 14:54:24
- - #luq   Co Wy z tym WHERE id = xxx? Przecież można: [SQL]...   18.06.2011, 15:59:48
|- - Speedy   Cytat(#luq @ 18.06.2011, 16:59:48 ) C...   19.06.2011, 20:09:23
- - lysy2005   Cytat(#luq @ 18.06.2011, 16:59:48 ) @...   19.06.2011, 17:09:18
- - aachi   Może rozbij tablice na kilkanaście mniejszych. Nie...   19.06.2011, 17:35:00
- - aachi   Panowie, ale pamiętacie, że autor nie potrzebuje l...   19.06.2011, 20:27:39
|- - Speedy   Cytat(aachi @ 19.06.2011, 21:27:39 ) ...   19.06.2011, 20:40:20
- - Fifi209   Fajnie jakbyś pokazał strukturę tej tabeli lub naw...   19.06.2011, 20:36:07
- - vokiel   Wybaczcie link do bloga, ale kiedyś o tym pisałem,...   19.06.2011, 20:56:24
|- - aachi   Cytat(vokiel @ 19.06.2011, 20:56:24 )...   19.06.2011, 21:15:32
- - by_ikar   Dobrym rozwiązaniem byłoby zastosowanie cron'a...   20.06.2011, 09:16:55
|- - uupah5   coraz ciekawsze pomysły: rozbijanie tabeli na wiel...   20.06.2011, 09:49:40
|- - by_ikar   Cytat(uupah5 @ 20.06.2011, 10:49:40 )...   20.06.2011, 16:59:57
|- - uupah5   Cytat(by_ikar @ 20.06.2011, 17:59:57 ...   20.06.2011, 22:28:44
- - thek   Ja osobiście kombinowałbym także pod kątem: Zlicz ...   20.06.2011, 14:15:08


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

 



RSS Aktualny czas: 17.10.2025 - 15:46