Véletlenszerű kép lekérése
Szeretnék egy oldalon véletlenszerűen képeket megjeleníteni de nem egészen tudom, hogy hogyan tegyem ezt a képeket a webszerveren tárolom a képek adatai pedig adatbázisban vannak.
Én elsőre úgy gondoltam, hogy minden feltöltött kép kap egy id-t és akkor lekérem az adatbázisból a képeknél a legkisebb és a legnagyobb id-t szóval az első és az utolsó képet majd ezt a két számot berakom egy mt_rand()-ba és a véletlen szám alapján jelenítem meg a képet.
De aztán gondolkodtam és olyan problémák lehetnek, hogy az oldalon lehet képet törölni szóval ha a generált képnek az id-jét már törölték akkor nem fog megjelenni semmi szóval nem tudom, hogy tudnám ezt megoldani.
Ha valaki tudna segíteni ebben azt nagyon megköszönném.
■ Én elsőre úgy gondoltam, hogy minden feltöltött kép kap egy id-t és akkor lekérem az adatbázisból a képeknél a legkisebb és a legnagyobb id-t szóval az első és az utolsó képet majd ezt a két számot berakom egy mt_rand()-ba és a véletlen szám alapján jelenítem meg a képet.
De aztán gondolkodtam és olyan problémák lehetnek, hogy az oldalon lehet képet törölni szóval ha a generált képnek az id-jét már törölték akkor nem fog megjelenni semmi szóval nem tudom, hogy tudnám ezt megoldani.
Ha valaki tudna segíteni ebben azt nagyon megköszönném.
ORDER BY RAND()
rand nem biztos, hogy jó
mt_rand() végülis nem is rossz
SELECT *
FROM kepek
WHERE id>$randid
ORDER BY id
LIMIT 1
Jogos!
order by rand()
!Viszont nem feltétlenül lesz
Random OFFSET
mt_rand(0,mysqli_num_rows($query)-1)
szerintem eddig ez a
visszavonom. nagy offset-et
Nem triviális méretű táblára
full index scan?
(lehet, hogy csak én vagyok lemaradva, de indexekkel kapcsolatban még nem találkoztam a kifejezéssel)
Nem, vagy nem feltétlenül,
Amúgy a kérdésfelvetésből én nem gondolnám, hogy performancia gondjai vannak a kérdezőnek. Ha meg mégis, akkor én inkább azt javasolnám, hogy a háttérben töltsön valami (daemon, cron, akármilyen process) egy queue-t, és abból rángassák ki a képeket a requestek, mintsem hogy minden requestkor akármivel is nekiessen egy monster táblának.
De ha pl a db postgresql <
Az utókor kedvéért javítom magam :) A pg most sem tárol visibility infót az indexben, hanem egy visibility mapet használ, és az alapján képes index-only scant futtatni, ahol lehet. Viszont a 9.2-re jól emlékeztem :) Bővebben:
http://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.2#Index-only_scans
Hogy tárolod a képeket?Mit
Mit csinálsz a töröltekkel? (valóban törlöd őket vagy csak az adatbázisban jelölöd meg töröltként?)
Milyen mennyiségről van szó? (néhány száz, ezres, esetleg milliós nagyságrend?)
Azon törtem a fejem a válaszokat olvasva, hogy nem lenne-e gyorsabb, kisebb erőforrás igényű a fájlrendszerből válogatni véletlenszerűen, és az így megtalált kép adatait lekérni az adatbázisból...
Query szinte mindig gyorsabb
Nagy rekordszám esetén én adnék pl. egy 'number' mezőt a rekordokhoz, ami egy unsigned int és unique. Egyébként random. A kép insert-kor kell ügyesen belőni (tranzakció), hogy véletlen legyen, de próbáljon újat, ha már beletrafált egy létezőbe. Lekéréskor pedig amelyik pl. nagyobb, mint egy pillanatnyi random, és LIMIT 1. Persze ehhez is tudni kell a maximumot, de nincs "esélytöbbszörözés", mint id esetén. (Illetve van, de az is véletlenszerű.)
Ez (sem) igazán tuti, de mindenképp MySql-oldalon érdemes megoldani, mert az a leggyorsabb.
Azt ne felejtsd el, hogy a
Ha jól szervezi a könyvtárstruktúráját, előfordulhat, hogy gyorsabb lesz.
~30 éve a használt állományok valahogy úgy voltak felosztva, hogy soros, indexelt és ... már nem emlékszem a pontos elnevezésre, valami direct access v. hasonló.
Ez utóbbi úgy működött, hogy az azonosítóból ki lehetett számolni a rekord pontos helyét, emiatt nagyon gyors volt benne az azonosító alapú keresés. Na itt is valami hasonló megoldásra gondolnék. Nem lennék ennyire lusta, tán még össze is dobhatnék valami performancia tesztet. Persze mindehhez még ott van a fájlrendszer típusa is, ami szintén nem mindegy...
De a kérdező eltűnt, így merőben felesleges energiapazarlásnak tűnik a dolog.