![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 0 Dołączył: 27.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Wygląda to tak: mam plik php, w którym losowany jest obrazek z bazy, jaki powinien być kod by po kliknięciu w dany obrazek, który się pojawi, ten sam obrazek został otworzony na drugiej podstronie (ew. jaki też kod do "odebrania" tego obrazka powinien być na podstronie)?
Obecnie wyświetlanie losowego obrazka mam tak napisane:
mi się wydaje, że trzeba to jakoś na zmiennej GET zrobić lub zmodyfikować jeszcze zapytanie do bazy, ale nie wiem jak... |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 433 Pomógł: 64 Dołączył: 29.01.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Mozesz sobie wynik losowania zapisac w sesji, chyba wystarczy.
-------------------- |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 341 Pomógł: 40 Dołączył: 23.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
uuuuuuuuuuf...
NIGDY ale to NIGDY nie uzywaj ORDER BY RAND() zapomnij ze taka opcja istnieje. jest kilka lepszych sposobow by zarżnąć bazę, ale naprawde nie wiele. w kazdym mozliwym kursie mysql'a odnosnie optymalizacji - jest to pietnowane na pierwszym miejscu... j. ps owe 'nigdy' oczywiscie sie odnosi do zawodowego pisania programow, hobbistycznie, lub na uczelnie - ujdzie.. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 0 Dołączył: 27.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
a więc co polecasz?
![]() |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 341 Pomógł: 40 Dołączył: 23.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
zalezy od tego jak masz zbudowana baze danych
jesli masz index ciagly - pobierz wszesniej najwieksza wartosc ( np max(id) ) i wylosuj sobie numerek po stronie php jesli potrzebujesz wiecej, i w dodatku masz nieciagly index - mozesz sprobowac nastepujaca nastepujaca sciezke : * pobierz max id * wygeneruj wieksza liczbe unikatow * wklej je do zapytania z IN * daj limit. co w twoim konkretnym przypadku dawalo by np. rezultat:
daje ci to gwarancje, ze nawet jesli trafisz na nieistniejacy index - bedziesz mial prawidlowy wynik. tak naprawde sposob zalezy od tego jaka masz strukture - ale naprawde, order by rand to zło w czystej postaci Ten post edytował alegorn 21.03.2012, 18:21:19 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 14.11.2011 Ostrzeżenie: (0%) ![]() ![]() |
Skoro już narzekasz, że nieoptymalne, to nie polecaj przetwarzania czegoś w PHP i drugiego zapytania...
Nawet jak nie trafi, to przez znak <= wybierze pierwszy mniejszy. Oczywiście przy dziurach w numeracji nie ma równej szansy na każdy obrazek. Im więcej dziur w numeracji po danym obrazku, tym większa na niego szansa. Jak to wielki problem, przez jego znaczenie w aplikacji, to może coś takiego:
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 341 Pomógł: 40 Dołączył: 23.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Skoro już narzekasz, że nieoptymalne, to nie polecaj przetwarzania czegoś w PHP i drugiego zapytania... hmm.. przy tym zapytaniu Cytat SELECT * FROM images WHERE id <= FLOOR( RAND()*(SELECT max(id) FROM images) )+1 LIMIT 1 zawsze bedzie zwracany pierwszy rekord. (tutaj na poczatek wybierasz x rekordow, <nawet cala tabele>, i obcinasz wszystko do pierwszego rekordu) druga częśc z : limit x,1 zadziała prawidłowo, ale jest nieoptymalne. (zmuszasz mysql'a do selecta x+1 rekordow, nastepnie do obciecia puli x - co przy większej ilości danych jest bardzo kosztowne << choc tutaj nie pamietam w 100% dokladnie tego, musialbym doczytac) moim zdaniem ograniczenie do 5 rekordow, jakie ja zastosowalem, jest mniej kosztowne. to po pierwsze. edit: jesli nie wierzysz - sprawdz explainem ilosc rekordow po drugie, nie jest prawdą że jedno wielkie zapytanie wykona sie szybciej niz kilka mniejszych (nawet z koniecznoscia obrobki po stronie php) przynajmniej, nie na wydajnym serwerze. dzięki temu, ze rozbijasz zapytanie na kilka wątków, możesz je wykonać na kilku procesorach. jesli wysyłasz jedno wielkie zapytanie - wykorzystywany jest tylko jeden procesor... ot, kwestia skalowania aplikacji. na nieobciążonej maszynie, - tak, pojedyncze zapytanie będzie szybsze, ale na stress testach - wyniki calej aplikacji będą diametralnie różne.. j. Ten post edytował alegorn 22.03.2012, 16:21:12 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 10:07 |