Συχνη ανακληση δεδομενων

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

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

Απάντηση
nikoskourtis
Δημοσιεύσεις: 26
Εγγραφή: 07 Μάιος 2008 00:17

Συχνη ανακληση δεδομενων

Δημοσίευση από nikoskourtis » 30 Δεκ 2008 14:20

Φτιαχνω μια ιστοσελιδα σε php και mysql. Σε καποια μερη του κωδικα απαιτειται αρκετες φορες η ανακληση των ιδιων δεδομενων απο εναν πινακα της βασης. Τουλαχιστον ετσι το εχω κανει. Ομως Υπαρχει η εναλλακτικη λυση να φορτωνονται μια φορα τα δεδομενα σε μια μεταβλητη-array και ετσι να μην ψαχνει το προγραμμα συνεχεια στη βαση δεδομενων.

Θελω να ρωτησω οσους εχουν εμπειρια τι απ τα 2 ειναι καλυτερο; Το συνεχες ψαξιμο στη βαση δεδομενων καθυστερει την αναζητηση; Ειναι σωστο να ψαχνει ο κωδικας συνεχεια στη βαση δεδομενων ή ειναι μπακαλικη μεθοδος;


ΓΙα να γινω πιο συγκεκριμενος το script μου εκτυπωνει ολες τις τιμες ενος πινακα της βασης δεδομενων αλλα καθε φορα με μια συγκεκριμενη σειρα που θα δινεται. Συνεπως αν ο πινακας της βασης εχει 100 εγγραφες, τοτε το script μεσω βρογχου θα κανει 100 select για να τυπωσει τις τιμες. Ειναι αποδεκτη αυτη η λυση ή πρεπει να φορτωνω και τις 100 εγγραφες σε ενα array και μετα ο βρογχος να κανει αναζητηση στο array και να εκτυπωνειμε τη σειρα που θελω;

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

Συχνη ανακληση δεδομενων

Δημοσίευση από dva_dev » 30 Δεκ 2008 14:55

Σε ένα πίνακα, όσες εγγραφές και να έχει 1 select χρειάζεσαι για να τις πάρεις. Μου φαίνονται πολλά 100 select για 100 εγγραφές. Μάλλον και άλλο εννοείς ή κάνεις και δεν το λες σωστά.

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Συχνη ανακληση δεδομενων

Δημοσίευση από soteres2002 » 30 Δεκ 2008 22:45

Αν έχεις δεδομένα απο οποιαδήποτε πηγή (όπως μια βάση δεδομένων στην περίπτωσή σου), τα οποία γνωρίζεις ότι για κάποιο χρονικό διάστημα παραμένουν αμετάβλητα, μπορείς να χρησιμοποιήσεις μια cache (όπως το memcached), ώστε να πάρεις τα δεδομένα σου ταχύτερα μέσω της RAM χωρίς μεσολάβηση read/write στο δίσκο που κάνει η βάση δεδομένων. O χρόνος ανάκτησης από την RAM είναι σαφώς απίστευτα γρηγορότερος απο την ανάκτηση από σκληρό δίσκο, αλλά και είναι μια καλή τεχνική ώστε να επιβαρύνεις λιγότερο το δίσκο. Μια βάση δεδομένων μπορεί κατα μέσω όρο να έχει αρκετό φόρτο, οπότε χάνεις σε απόδοση, ενώ με την λύση της cache γλιττώνεις τον περιττό αυτό χρόνο που σου τρώει η βάση για τη δουλειά αυτή. Το script σου μπορεί περιοδικά να ελέγχει τη ΒΔ αν υπάρχουν ενημερωμένα δεδομένα, μέσω ενός cron job, ή μέσω της σελίδας. Στην περίπτωση που το κάνεις αυτό μέσα από την σελίδα σου όταν την ζητά ο χρήστης από τον WebServer, στην χειρότερη θα καταλάβεις ότι υπάρχει 1 ενημέρωση στην ΒΔ (εκτελώντας 1 μόνο query) και θα τραβήξεις τα δεδομένα στην cache και στον browser του χρήστη. Οι επόμενοι χρήστες θα παίρνουν τα νέα δεδομένα από την σελίδα σου μέχρι να ενημερώσεις εκ νέου την cache. Και στις 2 περιπτώσεις δεν έχεις φόβο για διπλασιασμό των δεδομένων στην cache ούτε για απώλειες σε περίπτωση που 2 χρήστες χρησιμοποιούν ταυτόχρονα την cache/db (αλλά ας μην επεκταθούμε σε αυτό). Είναι σίγουρη λύση, και την αποκολουθούν μεγάλα high profile σάιτς, όπου εκεί βέβαια η cache αυτή είναι συνήθως κατανεμημένη σε πολλούς σέρβερς και όταν ο χρήστης ζητά τα δεδομένα αυτά ανακτούνται επιλέγοντας 1 σέρβερ με κάποιας μορφής clustering από τον load balancer από τον οποίο το σκριπτ ζητά τα δεδομένα. Με τον τρόπο αυτό αποφέυγεις το throttling στην DB, πρόβλημα που κάθε site με τεράστιες ΒΔ αντιμετώπισε χωρίς τις cache.

Άβαταρ μέλους
afroditi590
Δημοσιεύσεις: 123
Εγγραφή: 08 Ιαν 2007 11:52

Συχνη ανακληση δεδομενων

Δημοσίευση από afroditi590 » 31 Δεκ 2008 11:59

Αυτό πως μπορεί να γίνει? Έχεις να μου δώσεις κάποιο tutorial ή κάτι ώστε να με βοηθήσει να το κάνω? Η αλήθεια είναι ότι δεν έχω ιδέα το πως μπορεί να γίνει αυτό αλλά μου φάνηκε πολύ ενδιαφέρον από τη περιγραφή που έκανες και θα ήθελα να το δοκιμάσω.. :lol:

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Συχνη ανακληση δεδομενων

Δημοσίευση από soteres2002 » 31 Δεκ 2008 18:18

Στο http://www.danga.com/memcached/ θα βρεις τον caching daemon memcached που χρησιμοποιείται από το Livejournal. Υπάρχει API για διάφορες γλώσσες: C, Perl, PHP. Μέσω του API και του service αυτού, μπορείς να αποθηκεύσεις και να πάρεις ότι δομή δεδομένων θέλεις με ένα είδος σειριακοποίησης (το κάνει το ΑΡΙ αυτό εσωτερικά, δεν σε νοιάζει). Tutorial δεν υπάρχει, απ όσο ξέρω, αλλά για αρχή οι πληροφορίες που έχει το site αυτό και όσα είπαμε παραπάνω είναι καλές αρχικές ιδέες για να φτιάξεις κάτι σαφώς καλύτερο από το να επιβαρύνεις μονίμως την βάση δεδ. Επίσης, μην ψάχνεις για cookbooks για τέτοιου είδους βελτιστοποίηση, δεν υπάρχουν περπατημένες, εκτός από το πώς χρησιμοποιούνται τα ΑΡΙs (πληροφορίες που υπάρχουν στο συγκεκριμένο site, στο documentation της βιβλιοθήκης). Η μόνη περπατημένη είναι πώς θα συνδέεσαι στον caching daemon.

Για αρχή, μπορείς να εγκαταστήσεις την cache στο ίδιο μηχάνημα που βρίσκεται και ο webserver. Ορίζεις πόσο χώρο από τη RAM θες να δεσμεύσει maximum η cache, και από κει και πέρα κάνεις client connections είτε από PHP, C, Perl κτλ κτλ, δηλ αποθηκεύεις και παίρνεις πίσω τις δομές που αποθήκευσες με get/put ρουτίνες.

Αν θές να κάνεις κατανεμημένο caching, θες τουλάχιστον 2 μηχανήματα. Με 2 μηχανήματα, το ένα πρέπει να είναι slave host και ο άλλος master και slave. Όταν είναι master ένας σέρβερ, κατανέμει το φόρτο είτε στον εαυτό του και στους υπόλοιπους σέρβερ στο δίκτυο που είναι συνήθως συνδεδεμένοι με gigabit ethernet. Για 1 απλό setup απλά ανοίγεις στον router σου το πορτ πχ 80, και όλα τα requests να πηγαίνουν στην ΙΡ του master. Ο master κατανέμει το φόρτο, παίρνει πίσω τα αποτελέσματα και τα στέλνει πίσω στους clients. Το θετικό εδώ είναι ότι έχεις άυξηση της απόδοσης με πολλούς σέρβερ που δουλεύουν παράλληλα. Το πώς θα τα συνδέσεις υπάρχουν ολόκληρες θεωρίες ανάλογα με τις εφαρμογές. http Load balancer για τον μάστερ υπάρχει και στο πρώτο λινκ.

Εδώ μερικά λινκς:
http://gr2.php.net/memcache (docs)
http://www.softwareprojects.com/resourc ... -1654.html (cache sessions)

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Συχνη ανακληση δεδομενων

Δημοσίευση από cherouvim » 01 Ιαν 2009 16:44

Μυρίζει N+1 Selects Problem.

Βρες τρόπο να φέρεις τα δεδομένα σου με ένα query.
πχ αντι για:

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

select * from articles where id = 13
select * from articles where id = 14
select * from articles where id = 15
select * from articles where id = 18
select * from articles where id = 22
select * from articles where id = 25
κάνε:

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

select * from articles where id in (13, 14, 15, 18, 22, 25)

Άβαταρ μέλους
afroditi590
Δημοσιεύσεις: 123
Εγγραφή: 08 Ιαν 2007 11:52

Συχνη ανακληση δεδομενων

Δημοσίευση από afroditi590 » 03 Ιαν 2009 11:23

se euxaristw para poli soteres2002, tha to dokimasw kai elpizw na doulepsei :-?

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

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

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