Skocz do zawartości

Losowanie liczb, chodzi o wydajność


zizou15

Rekomendowane odpowiedzi

  • Odpowiedzi 30
  • Dodano
  • Ostatniej odpowiedzi
Chciałbym wylosować z tych liczb 3 liczby. Jakie algorytm byłby najbardziej wydajny?
Chodzi ci o pobranie 3 losowych rekordów z bazy danych ? Jeśli tak to może np.: znając liczne rekordów w bazie danych przygotowujesz sobie 3 liczby losowe funkcja rand();

$liczba1=rand(0,$ilosc_rekordow);

$liczba2=rand(0,$ilosc_rekordow);

$liczba3=rand(0,$ilosc_rekordow);

Nastepnie wykonujesz 3 zapytania

SELECT z klauzulą LIMIT $liczba1,1;

SELECT z klauzulą LIMIT $liczba2,1;

SELECT z klauzulą LIMIT $liczba3,1;

pobierające jeden rekord od nr = $liczba1...

Nie sprawdzałem dla dużych baz, ale powinno być wydajne tak jak pojedyńcze zapytanie.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

O takim czymś na początku myślałem z tym że te rokordy nie mogą sie powtarzać wiec przy losowaniu liczby:

$liczba2=rand(0,$ilosc_rekordow);

musiałbym sprawdzać czy jest różna ok $liczba1 a przy losowaniu $liczba3 musze sprawdzac czy liczba jest rózna od $liczba1 i $liczba2.

Ale pytanie czy to bedzie bardziej wydajne niz

ORDER BY RAND() LIMIT 3

?

Mam baze ok 10 000 rekordów.

Skuteczne pozycjonowanie stron www: M40.pl - Agencja interaktywna specjalizująca się w pozycjonowaniu stron internetowych.

 

Odnośnik do komentarza
Udostępnij na innych stronach

Rusz głową, to zrobisz.

Mam baze ok 10 000 rekordów.

Po jaki się produkowałem i robiłem testy tego zapytania w zależności od wielkości bazy?

Nawet wnioski wyciągnąłem za Ciebie. Wystarczy przeczytać i wrócić do punktu pierwszego tego posta.

Polecam linki stałe w Seomatik.pl oraz dopalacz stron Gotlink.pl.

obrazek.jpg

Odnośnik do komentarza
Udostępnij na innych stronach

musiałbym sprawdzać czy jest różna ok $liczba1 a przy losowaniu $liczba3 musze sprawdzac czy liczba jest rózna od $liczba1 i $liczba2.
NP Możesz wylosowane liczny załadować np. do tablicy i jeśli następna dodawana by już była w tablicy, to program losuje inną... Implementaci przygotowania 3 unikalnych liczb może być masa :)

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Przecież przy 1 000 000 rekordów Mysql będzie musiał wywołać 1 000 000 razy generator liczb losowych i jescze to posortować.

Jesteś pewny że to w ten sposób działa? Czyżby programisci mysql byli aż tak tępi?

Programiści tępi czy ty ?

Przepraszam, ale wkurza mnie sposób myślenia, nie znam się na tym za bardzo, ale przecież ta funkcja musi działać w taki sposób jak opisałem inaczej mysql byłby bez sensu. Ta funkcja mówi posortuj mi wszystkie rekordy przpisując każdemu z nich losową wartość - gdyby programiści poszli na jakieś uprosczenie taki Myql sypałby się jak cholera i byłby NIEPRZEWIDYWALNY :).

Naprawdę nie trzeba konczyć fakultetu z optymalizacji baz danych, wystarczy mieć wyobraźnię, stąd prosiłem o podanie konkretów - czyli dokładnie po co to jest. Może okazać się, że wystarczy związać z funkcją czasu, albo jescze w jakiś innych spsób by uzyskac zamierzony efekt kosztem małeo meczenia bazy.

Każde zapytanie, które wykonuje się na dobrym komputerze powyzej jedej sekundy - wróży nam przy zwykłym koncie hostingowym typu 10-50 GB/miesiąc "zwałkę" serwisu :/.

a każda baza rośnie !

Panowie wyobraźnia :)!!!

$liczba1=rand(1,$liczba_rekordow);

$liczba2=$liczba1+rand(1,$liczba_rekordow/2);

$liczba3=$liczba2+rand(1,$liczba_rekordow/2);

if ($liczba2)>$liczba_rekordow {$liczba2=$liczba2-$liczba_rekordow;}

if ($liczba3)>$liczba_rekordow {$liczba3=$liczba3-$liczba_rekordow;}

rozkład może nie jest idealny ale się nie powtórzą :)

Odnośnik do komentarza
Udostępnij na innych stronach

Wykonywałem zapytanie RAND() LIMIT 1 na bazie 300 000+ rekordów, Zapytanie się wykoywało 9+ sekund, obciążenie serwera 3+. Serwer się gotował.

Od czasu jak losuje rekord w php i robię SELECT po zindeksowanym id, to wykonanie 0.5-, a obciążenie 1-.

Odnośnik do komentarza
Udostępnij na innych stronach

1. zapytaj o liczbe rekordow i do zmiennej $rows albo od razy $N

2.

$N=$rows; # z ilu losowac
$n=3;	# ile wylosowac
$Tab=array();
$Res=array();
for ($i=0;$i<$N;$i++)$Tab[$i]=($i+1);
for ($i=0;$i<$n;$i++){
$x=rand(0,($N-1));
$Res[count($Res)]=$Tab[$x];
array_splice($Tab,$x,1);
$N--;
}

i masz tablicę z losowymi liczbami, niepowtarzającymi się, w danym przedziale liczb od 0 do $N.

a dalej w petli od 0 do $n

wybierz z bazy danych.

$pole = mysql_result($result, $Res[$n], "pole");

powinno byc szybkie i nie obciążające przy małym $n i dużym $N

Odnośnik do komentarza
Udostępnij na innych stronach

mam takie pytanie, a jak nie ma wszystkich id po kolei w bazie danych, to jak to wylosuje? :D

K..wa następny kaleka umysłowy czy po porstu LEŃ.

kilka posóŧw wcześniej

... wtedy losujemy z przedzialu 1-max_id a w pytaniu uzywamy > zmiast = i LIMIT 1 jakby rekord o wylosowanym ID nie istniał

Ludzie czytajcie, bo się słabo mi robi

Odnośnik do komentarza
Udostępnij na innych stronach

mrtn, nie przeczytałem tamtej części Twojej wypowiedzi, zawiera ona tylko 2 linie, więc mogłem jej nie zauważyć :|

losowanie poejdynczego rekordu na pewno łatwiej zrobic znajac maxymalny ID

wtedy losujemy z przedzialu (...)

co do wyzwiska poczytaj sobie Art. 212 oraz 216 Kodeksu Karnego :/

+ Strefa Download: www.rzymek.9g.pl

+ Forum Download: www.rzymek.9g.pl/forum

+ RzymekUpload: www.rzymek.9g.pl/upload

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności