Το mysql join αυξάνει το Load;

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

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

Απάντηση
Άβαταρ μέλους
cdhyper
Literature Moderator
Δημοσιεύσεις: 9707
Εγγραφή: 23 Ιουν 2001 03:00
Τοποθεσία: Φωτονερόπετρα
Επικοινωνία:

Το mysql join αυξάνει το Load;

Δημοσίευση από cdhyper » 21 Σεπ 2009 14:20

Η ερώτησή μου είναι αν σε μεγάλες βάσεις με πολλές εγγραφές το mysql join αυξάνει το mysql load. Είναι καλύτερα (πάντα σχετικά με τον φόρτο) να μην γίνεται το join κα να βρίσκονται τα δεδομένα που χρειαζόμαστε στον ίδιο πίνακα;
Σύγκριση τιμών Supermarket: http://www.shopnsave.gr
Νέα Ιταλικα επιπλα κουζινας
Για φιλοσόφους: http://filosofia.gr και http://liantinis.org

alexsoft

Το mysql join αυξάνει το Load;

Δημοσίευση από alexsoft » 21 Σεπ 2009 15:00

Όλα είναι σχετικά.....

Εξαρτάται από την πολυπλοκότητα των ερωτημάτων και τα αποτελέσματα που θέλεις να πάρεις.

Για παράδειγμα δεν μπορείς να έχεις στον ίδιο πίνακα την εγγραφή του χρήστη και την εγγραφή του άρθρου. Θέλεις όμως να ξέρεις ποιος το έγραψε.... άρα θα χρησιμοποιήσεις σίγουρα σύνδεση με τον πίνακα χρηστών.

Στο προκείμενο τώρα.... από αυτά που βλέπω στα δικά μου projects δεν είναι τόσο μεγάλη η καθυστέρηση στο άνοιγμα και δεύτερου κλπ. πίνακα ταυτόχρονα αρκεί να έχεις δομήσει καλά τα index των πινάκων και φυσικά να έχεις την κατάλληλη σύνταξη της JOIN.

Ίσα - ίσα θα έλεγα ότι σε πολλές περιπτώσεις μπορεί να είναι και ταχύτερη, ειδικά εάν οι συνδεδεμένοι πίνακες είναι σταθερού μήκους (FIXED), από την δήλωση πολλών πεδίων μέσα στον ίδιο πίνακα.

Αυτή είναι η δική μου άποψη..... άλλοι μπορεί να έχουν διαφορετική.... πάντως μόνο με δοκιμές θα μπορέσεις να δεις τι είναι καλύτερο για το project σου.

Άβαταρ μέλους
cdhyper
Literature Moderator
Δημοσιεύσεις: 9707
Εγγραφή: 23 Ιουν 2001 03:00
Τοποθεσία: Φωτονερόπετρα
Επικοινωνία:

Το mysql join αυξάνει το Load;

Δημοσίευση από cdhyper » 21 Σεπ 2009 15:08

Οι δοκιμές αν δεν μπαίνουν μέσα πολλοί χρήστες δεν λένε και πολλά και τώρα επειδή σε ένα project μπαίνουν πολλοί περισσότεροι χρήστες μέσα σε λίγες ημέρες και παρατήρησα αύξηση του mysql load έχω την απορία μήπως θα βελτιωνόταν η κατάσταση με αυτό που λέω.

Τις κατηγορίες των άρθρων σκέφτομαι να βάλω στον ίδιο πίνακα.
Σύγκριση τιμών Supermarket: http://www.shopnsave.gr
Νέα Ιταλικα επιπλα κουζινας
Για φιλοσόφους: http://filosofia.gr και http://liantinis.org

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27647
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Το mysql join αυξάνει το Load;

Δημοσίευση από cordis » 21 Σεπ 2009 15:09

ναι είναι καλύτερο να είναι στον ίδιο πίνακα, αλλά αυτό είναι ανάλογα την κανονικοποίηση των δεδομένων που έχει γίνει, τα indexes που υπάρχουν στα joins, ο τύπος δεδομένων των columns που γίνονται τα joins, κτλ.

πολλές φορές η ανάγκη μας να υπάρχουν δεδομένα σε έναν πίνακα μας οδηγεί στην δύσκολη διαχείρισή τους.

πχ.

table products
prod_id
prod_name
prod_price
prod_cat_id
prod_cat_name

table product_categories
prod_cat_id
prod_cat_name


γλιτώνουμε μεν το join, αλλά όταν αλλάζουμε κάτι στον product_categories θα πρέπει να το αλλάζουμε και στον products σε όλες τις σχετικές εγγραφές.

αν αποφασίσουμε να μην έχουμε καθόλου τον product_categories τότε όταν θέλουμε να πάρουμε μόνο της κατηγορίες θα περιμένουμε 'αιώνες' μέχρι να βρεθούν οι μοναδικές εγγραφές στον products.

μια άλλη λύση για την MySQL είναι να χρησιμοποιήσουμε την sphinx για τα indexes που στην MySQL μπορεί να μπει και ως ENGINE.
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6236
Εγγραφή: 30 Νοέμ 2004 03:09

Το mysql join αυξάνει το Load;

Δημοσίευση από fafos » 21 Σεπ 2009 15:48

H diafora enos pinaka me 2 h perissoterous pinakes einai mhdaminh...

to thema einai ti kaleis se autous tous pinakes pou kaneis join... an kaleis pragmata pou den xreiazesai (p.x. otan protoarxisa petaga ena select * from kai nomiza oti teleiosa :lol: ) tha sou vgalei sfyri kai kalemi o server mia hmera...

prepei na kaleis sto query mono oti xrhsimopoieis sthn selida...

prepei na kaleis to mikrotero monadiko xarakthristiko enos pinaka ( p.x. to id=1234 einai mikrotero tou category="Salates kai epidorpia" )

mhn dineis askopa mhkh sta stoixeia tou pinaka (p.x. an pairneis kapou to timestamp den mporei na einai pano apo 12 xarakthres)


se ena project opou xrhsimopoiousa to join gia 5 ( :o ) pinakes antimetopisa ena paromoio provlhma to opoio omos to ekane kai otan evaza ola ta stoixeia se enan pinaka...
to provlhma to dhmiourgouse mia selida kai apofasisa na to lyso me enan "Greek way" :P :
etrexa ena arxeio php me cronjob kathe 1 lepto to opoio epsaxne na vrei ta dedomena auths ths selidas alla mono ta nea. Auta ta dedomena ta evaza se enan neo pinaka kai h selida kalouse mono ayton ton pinaka..
einai san na kaneis cache thn selida efoson den allazei kati gia kathe xrhsth...
na shmeioso oti o pinakas htan se entelos diaforetikh vash apo authn pou etrexan oi ypoloipoi pinakes...

auto vevea den efarmozetai se selides pou einai entelos diaforetikes gia ton kathe xrhsth..

to site pou eixa kanei thn "mastoria" eixe synexeia pano apo 5.000 xrhstes online...
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

alexsoft

Το mysql join αυξάνει το Load;

Δημοσίευση από alexsoft » 21 Σεπ 2009 15:50

Cordis δεν είναι απαραίτητο να είναι καλύτερα...... εξαρτάται από πολλά πράγματα που πρέπει να ληφθούν υπόψη όπως αναφέρεις και εσύ.

Για παράδειγμα πιο γρήγορη είναι η ανάκτηση πληροφοριών όταν σπάσουμε ένα πίνακα σε δύο που ο ένας θα είναι FIXED (ΔΕΝ ΠΕΡΙΕΧΕΙ ΤΥΠΟΥΣ TEXT & BLOB) και ο άλλος DYNAMIC (που θα περιέχει τα πεδία ΤΕΧΤ) από ότι να τα έχουμε όλα σε ένα δυναμικό πίνακα. Η αναζήτηση σε μια τέτοια περίπτωση είναι πολύ ταχύτερη.

Επίσης όπως προανέφερα (το ίδιο και εσύ) εξαρτάται από την πολυπλοκότητα. Δεν μπορούμε να βάλουμε στον ίδιο πίνακα τις κατηγορίες άρθρων μαζί με τα ίδια τα άρθρα.... αυτό είναι καταστροφικό.

Άρα είναι σίγουρο ότι θα χρησιμοποιήσουμε ενώσεις πινάκων..... το θέμα βρίσκεται στους δείκτες των πινάκων και στην επιλογή των κατάλληλων τύπων π.χ. καλύτερα INT από BIGINT.

cdhyper προσπάθησε να δημιουργήσεις πίνακες σύνοψης ή αποθηκευμένες ρουτίνες.... βελτιώνουν τον χρόνο απόκρισης πάρα πολύ.

Επίσης εάν δεν αλλάζουν πάρα πολύ συχνά τα δεδομένα δημιούργησε sql cache results. Έφτιαξα κώδικα τον οποίο τον δοκιμάζω ήδη πάνω στο cms μου και έχει τεράστια διαφορά απόκρισης και εμφάνισης

EDIT: Προσυπογράφω αυτά που αναφέρει ο fafos

Άβαταρ μέλους
cdhyper
Literature Moderator
Δημοσιεύσεις: 9707
Εγγραφή: 23 Ιουν 2001 03:00
Τοποθεσία: Φωτονερόπετρα
Επικοινωνία:

Το mysql join αυξάνει το Load;

Δημοσίευση από cdhyper » 21 Σεπ 2009 16:09

Σε παρόμοια περίπτωση με του fafos είμαι. Οπότε να φτιάξω έναν πίνακα με τα νέα άρθρα ο οποίος και θα είναι άμεσα προσπελάσιμος και έναν άλλο που θα περιέχει τα παλιά άρθρα και θα χρησιμεύει για αρχειακούς λόγους.

Η βάση είναι 200mb αυτή τη στιγμή. Σίγουρα με μια βάση γύρω στα 2mb θα πηγαίνει καλύτερα έτσι;
Σύγκριση τιμών Supermarket: http://www.shopnsave.gr
Νέα Ιταλικα επιπλα κουζινας
Για φιλοσόφους: http://filosofia.gr και http://liantinis.org

alexsoft

Το mysql join αυξάνει το Load;

Δημοσίευση από alexsoft » 21 Σεπ 2009 16:14

cdhyper έγραψε:Σε παρόμοια περίπτωση με του fafos είμαι. Οπότε να φτιάξω έναν πίνακα με τα νέα άρθρα ο οποίος και θα είναι άμεσα προσπελάσιμος και έναν άλλο που θα περιέχει τα παλιά άρθρα και θα χρησιμεύει για αρχειακούς λόγους.

Η βάση είναι 200mb αυτή τη στιγμή. Σίγουρα με μια βάση γύρω στα 2mb θα πηγαίνει καλύτερα έτσι;
ENNOEITAI

alexsoft

Το mysql join αυξάνει το Load;

Δημοσίευση από alexsoft » 21 Σεπ 2009 16:36

επίσης μια γρήγορη αλλαγή είναι η προσθήκη πεδίου [archived] που θα το θέτεις σε 1 εάν θέλεις να είναι αρχειοθετημένο και ένα αντίστοιχο index.

Οπότε βάζοντας στο sql ερώτημα σου και το WHERE archived=0 θα καλεί μόνο αυτά που δεν είναι αρχειοθετημένα, που σίγουρα θα είναι πολύ λιγότερα άρθρα.

Άβαταρ μέλους
cdhyper
Literature Moderator
Δημοσιεύσεις: 9707
Εγγραφή: 23 Ιουν 2001 03:00
Τοποθεσία: Φωτονερόπετρα
Επικοινωνία:

Το mysql join αυξάνει το Load;

Δημοσίευση από cdhyper » 21 Σεπ 2009 16:40

alexsoft νομίζω χρειάζομαι την παραπάνω δραστικότερη λύση, ένα πεδίο archived δεν θα μου λύσει και πολύ το πρόβλημα.

Μάλιστα. Θα εφαρμόσω λοιπόν αυτή τη λύση. Θα χωρίσω μια βάση άμεσης προσπέλασης στην ουσία η οποία θα περιέχει τα άρθρα των τελευταίων 20 ημερών ας πούμε τα οποία δεν θα είναι πάνω από 3-4mb το πολύ. Και θα βάλω ένα cron να στέλνει από τη νέα βάση τα άρθρα στην παλιά.

Σε όλα τα παραπάνω δεν θα ήταν και ιδανικό να βάλω την παλιά βάση-γουρούνι σε έναν άλλο server (στο ίδιο rack να είναι και γρήγορα);
Σύγκριση τιμών Supermarket: http://www.shopnsave.gr
Νέα Ιταλικα επιπλα κουζινας
Για φιλοσόφους: http://filosofia.gr και http://liantinis.org

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6236
Εγγραφή: 30 Νοέμ 2004 03:09

Το mysql join αυξάνει το Load;

Δημοσίευση από fafos » 21 Σεπ 2009 16:43

cdhyper έγραψε:
Σε όλα τα παραπάνω δεν θα ήταν και ιδανικό να βάλω την παλιά βάση-γουρούνι σε έναν άλλο server (στο ίδιο rack να είναι και γρήγορα);
yep... rothse to hosting sou an exei kapoio systhma cloud...
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
cdhyper
Literature Moderator
Δημοσιεύσεις: 9707
Εγγραφή: 23 Ιουν 2001 03:00
Τοποθεσία: Φωτονερόπετρα
Επικοινωνία:

Το mysql join αυξάνει το Load;

Δημοσίευση από cdhyper » 21 Σεπ 2009 16:57

Το έχω μελετήσει κι αυτό και χρειάζεται ένας load balancer 2 web servers και 1 mysql server για να φτιάξεις ένα ελάχιστο cluster, δηλαδή 4 servers και δεν θα μου λύσει και το πρόβλημα γιατί ο apache δεν με πολυαπασχολεί, η mysql είναι το θέμα.

Οπότε σκέφτομαι να μοιράσω την mysql σε 2 servers με τον παραπάνω τρόπο και μπορεί να βάλω και το διαχειριστικό panel στον δεύτερο server και έτσι οι χρήστες-επισκέπτες θα έχουν μόνο μια ελαφριά βάση να παίζουν και ένα καλό σύστημα cache που ούτως ή άλλως υπάρχει.
Σύγκριση τιμών Supermarket: http://www.shopnsave.gr
Νέα Ιταλικα επιπλα κουζινας
Για φιλοσόφους: http://filosofia.gr και http://liantinis.org

Άβαταρ μέλους
CyberCr33p
Honorary Member
Δημοσιεύσεις: 3203
Εγγραφή: 06 Νοέμ 1999 01:00
Τοποθεσία: Αθήνα
Επικοινωνία:

Το mysql join αυξάνει το Load;

Δημοσίευση από CyberCr33p » 21 Σεπ 2009 17:22

Δεν χρειάζεσαι load balancer ούτε 2 web-servers. Αυτό που θα σε βοηθήσει είναι να έχεις 2 mysql servers, έναν master που θα γίνεται η εισαγωγή των δεδομένων και ένα slave που θα χρησιμοποιείς για τις βαριές δουλειές, π.χ. για αναζητήσεις προϊόντων, ή οτιδήποτε θέλεις που χρειάζεται μόνο πρόσβαση για ανάγνωση και όχι για εγγραφή.

Άβαταρ μέλους
cdhyper
Literature Moderator
Δημοσιεύσεις: 9707
Εγγραφή: 23 Ιουν 2001 03:00
Τοποθεσία: Φωτονερόπετρα
Επικοινωνία:

Το mysql join αυξάνει το Load;

Δημοσίευση από cdhyper » 21 Σεπ 2009 17:24

Ναι αυτό σκέφτομαι να κάνω. Να αξιοποιήσω τους 2 servers για τη mysql όπως με βολεύει καλύτερα.
Σύγκριση τιμών Supermarket: http://www.shopnsave.gr
Νέα Ιταλικα επιπλα κουζινας
Για φιλοσόφους: http://filosofia.gr και http://liantinis.org

Άβαταρ μέλους
CyberCr33p
Honorary Member
Δημοσιεύσεις: 3203
Εγγραφή: 06 Νοέμ 1999 01:00
Τοποθεσία: Αθήνα
Επικοινωνία:

Το mysql join αυξάνει το Load;

Δημοσίευση από CyberCr33p » 21 Σεπ 2009 17:29

Όσο αφορά το JOIN δεν νομίζω εάν έχεις σωστά index να σου δημιουργήσει πρόβλημα. Πρόβλημα έχω δει σε κάποια scripts που κάνουν πολλαπλά JOIN, τόσα που βλέποντας και μόνο το QUERY να ζαλίζεσαι :-) Συχνό πρόβλημα όταν ένα query εκτελείται πολύ ώρα είναι να εμποδίσει άλλα queries να εκτελεστούν γιατί κλειδώνει το table.

Optimization στο mysql.cnf έχεις κάνει; Υπάρχουν κάποιοι γενικοί κανόνες για να ρυθμίσεις τις τιμές σε αυτό το αρχείο. Παίζει ρόλο η CPU/RAM, και να ρυθμίσεις να κρατιούνται στην cache queries (κάνεις κάτι διαιρέσεις για να βρεις τις κατάλληλες τιμές).

Ειδικά εάν στον server είναι μόνο αυτό το site μπορείς να κάνεις αρκετή καλή δουλειά.

Απάντηση

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

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

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