Προβλημα(?) με RAND();

Συζητήσεις για την βάση δεδομένων MySQL και το phpMyAdmin

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
geproh
Δημοσιεύσεις: 10
Εγγραφή: 31 Οκτ 2010 23:54
Τοποθεσία: Greeceeee

Προβλημα(?) με RAND();

Δημοσίευση από geproh » 13 Ιαν 2012 20:25

Γεια σας,
Θελοντας ενα πιο optimized αποτελεσμα για επιλογη τυχαιων αποτελεσματων απο την βαση δεδομενων, χρησιμοποιω το παρακατω query:

Κώδικας: Επιλογή όλων

(
	SELECT `primkey`,`onoma`
	FROM pinakas AS r1
	JOIN (SELECT ROUND(RAND() * (SELECT MAX(`primkey`) FROM `pinakas`)) AS id) AS r2
	WHERE r1.`primkey` >= r2.id
	ORDER BY r1.primkey ASC
	LIMIT 1
)
UNION ALL
( 
	το ιδιο query
)
UNION ALL
( 
	το ιδιο query
)
UNION ALL
( 
	το ιδιο query
)
UNION ALL
( 
	το ιδιο query
)
UNION ALL
( 
	το ιδιο query
)
Στο localhost, εμφανιζει διαφορετικα τυχαια αποτελεσματα, ωστοσο οταν το ανεβαζω στο site, δειχνει καθε φορα το ιδιο αποτελεσμα (και συγκεκριμενα το πρωτο primkey)

Γιατι συμβαινει αυτο;
Το μονο που σκεφτομαι ειναι οτι οφειλεται στο rand() ; Δηλαδη, λογω διαφορας εκδοσης mysql μεταξυ localhost και server του site.Ωστοσο δεν βρηκα περαιτερω πληροφοριες.
Μπορει καποιος να με βοηθησει στο πως να το κανω να δουλεψει;
Ευχαριστω! :)
Εικόνα

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Προβλημα(?) με RAND();

Δημοσίευση από gvre » 13 Ιαν 2012 20:58

Δεν ξέρω γιατί δε δουλεύει αλλά...
έχεις τρέξει το παραπάνω query με explain; Σε πίνακες με πολλές εγγραφές θα καθυστερεί αρκετά.

Μια λύση είναι το SELECT ... ORDER BY RAND() LIMIT 6 το οποίο όμως θα καθυστερεί και αυτό σε πίνακες με πολλές εγγραφές.

Μια καλύτερη λύση, αν δεν έχεις κενά id, είναι η εξής:
Κάνεις ένα query και παίρνεις το μικρότερο και μεγαλύτερο id. Υπολογίζεις 6 τυχαίους αριθμούς (πχ 1, 5, 8, 23, 44, 57) μέσω php και τρέχεις ένα query
SELECT ... WHERE id IN (1, 5, 8, 23, 44, 57)

geproh
Δημοσιεύσεις: 10
Εγγραφή: 31 Οκτ 2010 23:54
Τοποθεσία: Greeceeee

Προβλημα(?) με RAND();

Δημοσίευση από geproh » 13 Ιαν 2012 21:09

Μου φαινεται οτι περιεχονται κενα id, οποτε το 3ο το αποκλειουμε.
Κατεληξα σε αυτην την λυση γιατι το ORDER BY RAND() LIMIT που χρησιμοποιουσα ηταν οντως αργο, αρα αποκλειουμε και αυτην την λυση.
Σχετικα με το πρωτο, οχι αντιθετως ειναι για πινακες με πολλες εγγραφες. Δες εδω απ'οπου πηρα και τον κωδικα:
jan.kneschke.de/projects/mysql/order-by-rand/, και πηγαινε κατω κατω εκει που λεει performance.
Εικόνα

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Προβλημα(?) με RAND();

Δημοσίευση από gvre » 13 Ιαν 2012 21:12

Πόση ώρα χρειάζεται για να τρέξει το query σου;

geproh
Δημοσιεύσεις: 10
Εγγραφή: 31 Οκτ 2010 23:54
Τοποθεσία: Greeceeee

Προβλημα(?) με RAND();

Δημοσίευση από geproh » 13 Ιαν 2012 21:19

χμ..ειναι ολοκληρη ιστορια για να σου περιγραψω...
Οχι πολυ, ομως. κατω απο 1 sec.
ωστοσο εχω παρατηρησει οτι κατι φταιει και αργει το site οταν ειναι online γυρω στα 30 ατομα. Και ειναι τελειως παραλογο για τοσα λιγα ατομα και να καθυστερει η φορτωση του.(πχ 6-7 δευτερολεπτα) Οποτε επειδη δεν ξερω τι μπορει να φταιει, προσπαθω να κανω optimize οσο περισσοτερα queries μπορω,και μεσα σ'αυτα και αυτο. Ισως αυτο να μην φταιει για την καθυστερηση, απλα θα ηθελα να το φτιαξω για να σιγουρευτω.. :/
Εικόνα

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Προβλημα(?) με RAND();

Δημοσίευση από gvre » 13 Ιαν 2012 21:27

Η καθυστέρηση μπορεί να είναι οπουδήποτε (server, db, backend, frontend, network κλπ). Πρέπει να δεις τι είναι αυτό που σου δημιουργεί το πρόβλημα και να το φτιάξεις. Αν έχεις πρόσβαση στον MySQL server, μπορείς να ενεργοποιήσεις το slow query log και να δεις αν το πρόβλημα είναι από κάποιο query (αν δεις κάποιο query στο slow query log δε σημαίνει απαραίτητα ότι είναι αργό. Μπορεί να έχει load ο server).

Αν θέλεις, στείλε το url του site.

geproh
Δημοσιεύσεις: 10
Εγγραφή: 31 Οκτ 2010 23:54
Τοποθεσία: Greeceeee

Προβλημα(?) με RAND();

Δημοσίευση από geproh » 13 Ιαν 2012 21:41

Η καθυστερηση παρατηρηθηκε προσφατα μετα απο αρκετες αλλαγες που εγιναν στο site, και επειτα απο διορθωση ενος query που το καθυστερουσε αρκετα, πιστευω οτι ειναι ακομα 1-2 τα οποια επισης φταινε για την καθυστερηση, δεδομενου κιολας του γεγονοτος οτι μπορει να ειναι μεσα πχ 40 ατομα και το site να φορτωνει κανονικα/γρηγορα αλλα να ειναι και 30 και να καθυστερει υπερβολικα. Επισης ειναι vps απο καλο/γνωστο παροχο και πριν τις αλλαγες δεν υπηρχε προβλημα. αρα server,network,frontend τα αποκλειω... αρα μενει backend->db :/
Εικόνα

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Προβλημα(?) με RAND();

Δημοσίευση από gvre » 13 Ιαν 2012 23:33

Τρέξε τα με explain και θα δεις που είναι το πρόβλημα.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Προβλημα(?) με RAND();

Δημοσίευση από dva_dev » 14 Ιαν 2012 00:03

θα μπορούσες αν χρησιμοποιείς και κώδικα (π.χ. php) να δοκιμάσεις νατρέξεις ένα select count(*) from table για να πάρεις το πλήθος των εγγραφών.
μετά να πάρεις 6 τυχαία νούμερα (0..πλήθος) και να φτιάξεις το query που θα στείλεις για εκτέλεση (βάζοντας στα _random_? τα τυχαία νούμερα που έχεις).

select * from table limit _random_1, 1
union all
select * from table limit _random_2, 1
union all
select * from table limit _random_3, 1
union all
select * from table limit _random_4, 1
union all
select * from table limit _random_5, 1
union all
select * from table limit _random_6, 1

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Προβλημα(?) με RAND();

Δημοσίευση από gvre » 14 Ιαν 2012 14:53

Σωστό κι αυτό :)

geproh
Δημοσιεύσεις: 10
Εγγραφή: 31 Οκτ 2010 23:54
Τοποθεσία: Greeceeee

Προβλημα(?) με RAND();

Δημοσίευση από geproh » 27 Ιαν 2012 23:21

Σας ευχαριστω :)
Εικόνα

Απάντηση

Επιστροφή στο “MySQL”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης