Προγραμματισμός

7 κλειδιά για καλύτερη απόδοση MySQL

Ο Peter Zaitsev είναι ο συνιδρυτής και διευθύνων σύμβουλος τηςΠερόνα.

Ένας από τους τρόπους μέτρησης των εφαρμογών είναι μέσω της απόδοσης. Μία από τις μετρήσεις για την απόδοση της εφαρμογής είναι η εμπειρία χρήστη, η οποία γενικά μεταφράζεται σε «έπρεπε ο χρήστης να περιμένει περισσότερο από ένα λογικό χρονικό διάστημα για να πάρει αυτό που ήθελε».

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

Έχουμε πολλή έρευνα για το πώς η απόδοση επηρεάζει τη συμπεριφορά των χρηστών:

  • Το 79% των πελατών είναι λιγότερο πιθανό να επιστρέψουν σε έναν αργό ιστότοπο
  • Το 47% των καταναλωτών αναμένουν φόρτωση μιας ιστοσελίδας σε 2 δευτερόλεπτα ή λιγότερο
  • Το 40% των χρηστών εγκαταλείπουν έναν ιστότοπο εάν χρειάζονται περισσότερο από τρία δευτερόλεπτα για τη φόρτωση
  • Η καθυστέρηση ενός δευτερολέπτου στο χρόνο φόρτωσης σελίδας μπορεί να προκαλέσει απώλεια μετατροπής κατά 7% και λιγότερες προβολές σελίδας κατά 11%

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

Ένα κεντρικό στοιχείο αυτής της αλληλεπίδρασης είναι ο τρόπος με τον οποίο οι εφαρμογές υποβάλλουν ερώτηση στη βάση δεδομένων και πώς η βάση δεδομένων ανταποκρίνεται σε αιτήματα. Με οποιοδήποτε μέτρο, η MySQL είναι ένα από τα πιο δημοφιλή συστήματα διαχείρισης βάσεων δεδομένων. Περισσότερες επιχειρήσεις μετατοπίζονται στη MySQL (και άλλες βάσεις δεδομένων ανοιχτού κώδικα) ως λύση βάσης δεδομένων στα περιβάλλοντα παραγωγής τους.

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

Τα παρακάτω είναι μερικές βασικές συμβουλές για να σας βοηθήσουν να βελτιστοποιήσετε την απόδοση της βάσης δεδομένων MySQL.

Κλειδί βελτιστοποίησης MySQL # 1: Μάθετε πώς να χρησιμοποιείτε ΕΞΗΓΩ

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

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

Αντί να μαντέψετε και να ελπίζετε, θα πρέπει να μάθετε πώς να χρησιμοποιείτε το ΕΞΗΓΩ εντολή. Αυτή η εντολή σάς δείχνει πώς θα εκτελεστεί ένα ερώτημα και σας δίνει πληροφορίες για την απόδοση που μπορείτε να περιμένετε και πώς θα κλιμακωθεί το ερώτημα με το μεταβαλλόμενο μέγεθος δεδομένων.

Υπάρχουν πολλά εργαλεία - όπως το MySQL Workbench - που μπορούν να απεικονίσουν το ΕΞΗΓΩ έξοδος για εσάς, αλλά πρέπει να καταλάβετε τα βασικά για να το κατανοήσετε.

Υπάρχουν δύο διαφορετικές μορφές στις οποίες το ΕΞΗΓΩ Η εντολή παρέχει έξοδο: την παλιά μορφή πίνακα και ένα πιο μοντέρνο, δομημένο έγγραφο JSON που παρέχει σημαντικά περισσότερες λεπτομέρειες (φαίνεται παρακάτω):

mysql> εξήγηση format = json επιλέξτε avg (k) από sbtest1 όπου id μεταξύ 1000 και 2000 \ G

*************************** 1. σειρά ******************** *******

ΑΙΤΗΣΗ: {

"Query_block": {

"Select_id": 1,

"Cost_info": {

   "Query_cost": "762.40"

"Τραπέζι": {

"Table_name": "sbtest1",

"Access_type": "εύρος",

"Πιθανά πλήκτρα": [

"ΠΡΩΤΑΡΧΙΚΟΣ"

      ],

"Κλειδί": "PRIMARY",

"Used_key_parts": [

"ταυτότητα"

      ],

"Key_length": "4",

"Rows_examined_per_scan": 1874,

"Rows_produced_per_join": 1874,

"Φιλτραρισμένο": "100,00",

"Cost_info": {

"Read_cost": "387.60",

"Eval_cost": "374.80",

"Prefix_cost": "762.40",

"Data_read_per_join": "351Κ"

      },

"Μεταχειρισμένες_σόλες": [

"ταυτότητα",

"κ"

      ],

"Attach_condition": "(` sbtest`.`sbtest1`.`id` μεταξύ 1000 και 2000) "

    }

  }

}

Ένα στοιχείο που πρέπει να εξετάσετε είναι το "κόστος ερωτήματος". Το κόστος ερωτήματος αναφέρεται στο πόσο ακριβό το MySQL θεωρεί αυτό το συγκεκριμένο ερώτημα όσον αφορά το συνολικό κόστος εκτέλεσης του ερωτήματος και βασίζεται σε πολλούς διαφορετικούς παράγοντες.

Τα απλά ερωτήματα έχουν συνήθως κόστος ερωτήματος μικρότερο από 1.000. Τα ερωτήματα με κόστος μεταξύ 1.000 και 100.000 θεωρούνται ερωτήματα μεσαίου κόστους και γενικά είναι γρήγορα αν εκτελείτε μόνο εκατοντάδες τέτοια ερωτήματα ανά δευτερόλεπτο (όχι δεκάδες χιλιάδες).

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

Φυσικά αυτοί είναι αριθμοί επιδόσεων στο πάρκο, αλλά δείχνουν τη γενική αρχή. Το σύστημά σας μπορεί να χειριστεί το φόρτο εργασίας ερωτήσεων καλύτερα ή χειρότερα, ανάλογα με την αρχιτεκτονική και τη διαμόρφωσή του.

Κυρίαρχος μεταξύ των παραγόντων που καθορίζουν το κόστος του ερωτήματος είναι εάν το ερώτημα χρησιμοποιεί σωστά ευρετήρια. ο ΕΞΗΓΩ Η εντολή μπορεί να σας πει εάν ένα ερώτημα δεν χρησιμοποιεί ευρετήρια (συνήθως λόγω του τρόπου δημιουργίας των ευρετηρίων στη βάση δεδομένων ή του τρόπου δημιουργίας του ίδιου του ερωτήματος). Γι 'αυτό είναι τόσο σημαντικό να μάθετε να χρησιμοποιείτε ΕΞΗΓΩ.

Κλειδί βελτιστοποίησης MySQL # 2: Δημιουργήστε τα σωστά ευρετήρια

Ένα ευρετήριο βελτιώνει την απόδοση των ερωτημάτων μειώνοντας τον όγκο των δεδομένων στη βάση δεδομένων που πρέπει να σαρώσουν τα ερωτήματα. Τα ευρετήρια στη MySQL χρησιμοποιούνται για να επιταχύνουν την πρόσβαση στη βάση δεδομένων και να βοηθήσουν στην επιβολή περιορισμών στη βάση δεδομένων (όπως ΜΟΝΑΔΙΚΟΣ και ΞΕΝΟ ΚΛΕΙΔΙ).

Τα ευρετήρια βάσεων δεδομένων μοιάζουν πολύ με τα ευρετήρια βιβλίων. Διατηρούνται στη δική τους θέση και περιέχουν ήδη πληροφορίες στην κύρια βάση δεδομένων. Πρόκειται για μια μέθοδο αναφοράς ή έναν χάρτη όπου βρίσκονται τα δεδομένα. Τα ευρετήρια δεν αλλάζουν κανένα από τα δεδομένα σε μια βάση δεδομένων. Απλώς δείχνουν τη θέση των δεδομένων.

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

Οι καλά ευρετηριασμένες βάσεις δεδομένων όχι μόνο τρέχουν γρηγορότερα, αλλά ακόμη και ένα μεμονωμένο ευρετήριο μπορεί να επιβραδύνει μια βάση δεδομένων για ανίχνευση. Χρήση ΕΞΗΓΩ (όπως προτείνεται προηγουμένως) για να βρείτε δείγματα που λείπουν και να τα προσθέσετε. Προσοχή όμως: Μην προσθέτετε ευρετήρια που δεν χρειάζεστε! Τα περιττά ευρετήρια επιβραδύνουν τις βάσεις δεδομένων (δείτε την παρουσίασή μου σχετικά με τις βέλτιστες πρακτικές ευρετηρίασης MySQL).

Κλειδί βελτιστοποίησης MySQL # 3: Χωρίς προεπιλογές!

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

Για να έχετε την καλύτερη απόδοση από τη MySQL, είναι σημαντικό να κατανοήσετε τις ρυθμιζόμενες ρυθμίσεις MySQL και - πιο σημαντικό - να τις ρυθμίσετε ώστε να λειτουργούν καλύτερα για το περιβάλλον της βάσης δεδομένων σας.

Από προεπιλογή, η MySQL είναι συντονισμένη για εγκατάσταση ανάπτυξης μικρής κλίμακας και όχι για κλίμακα παραγωγής. Συνήθως θέλετε να ρυθμίσετε το MySQL ώστε να χρησιμοποιεί όλους τους διαθέσιμους πόρους μνήμης, καθώς και να επιτρέπει τον αριθμό των συνδέσεων που απαιτεί η εφαρμογή σας.

Ακολουθούν τρεις ρυθμίσεις συντονισμού απόδοσης MySQL που πρέπει πάντα να εξετάζετε προσεκτικά:

innodb_buffer_pool_size: Το buffer pool είναι το σημείο αποθήκευσης δεδομένων και ευρετηρίων. Αυτός είναι ο κύριος λόγος για τη χρήση ενός συστήματος με μεγάλη ποσότητα μνήμης RAM ως διακομιστή βάσης δεδομένων. Εάν χρησιμοποιείτε μόνο τη μηχανή αποθήκευσης InnoDB, συνήθως διαθέτετε περίπου το 80 τοις εκατό της μνήμης σας για το buffer pool. Εάν εκτελείτε πολύ περίπλοκα ερωτήματα, ή έχετε πολύ μεγάλο αριθμό ταυτόχρονων συνδέσεων βάσης δεδομένων ή έχετε πολύ μεγάλο αριθμό πινάκων, ίσως χρειαστεί να μειώσετε αυτήν την τιμή για να διαθέσετε περισσότερη μνήμη για άλλους σκοπούς.

Καθώς ορίζετε το μέγεθος της πισίνας buffer InnoDB, πρέπει να βεβαιωθείτε ότι δεν το έχετε ορίσει πολύ μεγάλο ή θα προκαλέσει ανταλλαγή. Αυτό σκοτώνει απολύτως την απόδοση της βάσης δεδομένων σας. Ένας εύκολος τρόπος για να ελέγξετε είναι να δείτε το Swapping Activity στο γράφημα Επισκόπηση συστήματος στο Percona Παρακολούθηση και διαχείριση:

Περόνα

Όπως δείχνει αυτό το γράφημα, μερικές φορές η εναλλαγή είναι μια χαρά. Εάν, ωστόσο, βλέπετε συνεχή δραστηριότητα ανταλλαγής 1MB ανά δευτερόλεπτο ή περισσότερο, θα χρειαστεί να μειώσετε το μέγεθος του buffer pool (ή άλλες χρήσεις μνήμης).

Εάν δεν έχετε την τιμή για innodb_buffer_pool_size σωστά στην πρώτη κίνηση, μην ανησυχείτε. Ξεκινώντας με το MySQL 5.7 μπορείτε να αλλάξετε δυναμικά το μέγεθος του buffer InnoDB buffer, χωρίς επανεκκίνηση του διακομιστή βάσης δεδομένων.

innodb_log_file_size: Αυτό είναι το μέγεθος ενός μεμονωμένου αρχείου καταγραφής InnoDB. Από προεπιλογή, το InnoDB χρησιμοποιεί δύο τιμές, ώστε να μπορείτε να διπλασιάσετε αυτόν τον αριθμό για να λάβετε το μέγεθος του κυκλικού χώρου επανάληψης καταγραφής που χρησιμοποιεί το InnoDB για να βεβαιωθείτε ότι οι συναλλαγές σας είναι ανθεκτικές. Αυτό βελτιστοποιεί επίσης την εφαρμογή αλλαγών στη βάση δεδομένων. Σύνθεση innodb_log_file_size είναι ζήτημα αντισταθμίσεων. Όσο μεγαλύτερος είναι ο χώρος επανάληψης που διαθέτετε, τόσο καλύτερη είναι η απόδοση που θα επιτύχετε για φόρτο εργασίας με ένταση εγγραφής, αλλά τόσο μεγαλύτερος είναι ο χρόνος για ανάκτηση σφαλμάτων εάν το σύστημά σας πάσχει από απώλεια ισχύος ή άλλα προβλήματα.

Πώς γνωρίζετε εάν η απόδοση της MySQL περιορίζεται από το τρέχον μέγεθος αρχείου καταγραφής InnoDB; Μπορείτε να καταλάβετε κοιτάζοντας πόσος από τον χρησιμοποιήσιμο χώρο επανάληψης καταγραφής χρησιμοποιείται πραγματικά. Ο ευκολότερος τρόπος είναι να δείτε τον πίνακα ελέγχου Percona Monitoring and Management InnoDB Metrics. Στο παρακάτω γράφημα, το μέγεθος αρχείου καταγραφής InnoDB δεν είναι αρκετά μεγάλο, καθώς ο χρησιμοποιούμενος χώρος ωθεί πολύ κοντά στον διαθέσιμο χώρο επαναφοράς καταγραφής (υποδεικνύεται από την κόκκινη γραμμή). Το μέγεθος του αρχείου καταγραφής σας πρέπει να είναι τουλάχιστον 20 τοις εκατό μεγαλύτερο από το μέγεθος του χώρου που χρησιμοποιείται για να διατηρήσει το σύστημά σας βέλτιστη απόδοση.

Περόνα

max_connections: Οι εφαρμογές μεγάλης κλίμακας συχνά απαιτούν πολύ περισσότερα από τον προεπιλεγμένο αριθμό συνδέσεων. Σε αντίθεση με άλλες μεταβλητές, εάν δεν το ρυθμίσετε σωστά, δεν θα έχετε προβλήματα απόδοσης (καθαυτά). Αντ 'αυτού, εάν ο αριθμός των συνδέσεων δεν επαρκεί για τις ανάγκες της εφαρμογής σας, η εφαρμογή σας απλώς δεν θα μπορεί να συνδεθεί στη βάση δεδομένων (η οποία μοιάζει με διακοπή λειτουργίας στους χρήστες σας). Είναι σημαντικό να αποκτήσετε αυτήν τη μεταβλητή.

Μπορεί να είναι δύσκολο να γνωρίζετε πόσες συνδέσεις χρειάζεστε για σύνθετες εφαρμογές με πολλά στοιχεία που εκτελούνται σε πολλούς διακομιστές. Ευτυχώς, η MySQL καθιστά πολύ εύκολο να δούμε πόσες συνδέσεις χρησιμοποιούνται κατά τη μέγιστη λειτουργία. Συνήθως θέλετε να διασφαλίσετε ότι υπάρχει τουλάχιστον 30 τοις εκατό κενό μεταξύ του μέγιστου αριθμού συνδέσεων που χρησιμοποιεί η εφαρμογή σας και του μέγιστου διαθέσιμου αριθμού συνδέσεων. Ένας εύκολος τρόπος για να δείτε αυτούς τους αριθμούς είναι να χρησιμοποιήσετε το γράφημα συνδέσεων MySQL στον πίνακα ελέγχου Επισκόπησης MySQL στο Percona Παρακολούθηση και διαχείριση. Το παρακάτω γράφημα δείχνει ένα υγιές σύστημα, όπου υπάρχει μεγάλος αριθμός πρόσθετων συνδέσεων.

Περόνα

Ένα πράγμα που πρέπει να θυμάστε είναι ότι εάν η βάση δεδομένων σας λειτουργεί αργά, οι εφαρμογές δημιουργούν συχνά υπερβολικό αριθμό συνδέσεων. Σε τέτοιες περιπτώσεις, θα πρέπει να εργαστείτε στο πρόβλημα απόδοσης της βάσης δεδομένων και όχι απλώς να επιτρέπετε περισσότερες συνδέσεις. Περισσότερες συνδέσεις μπορούν να επιδεινώσουν το υποκείμενο πρόβλημα απόδοσης.

(Σημείωση: Όταν ορίζετε το max_connections μεταβλητή σημαντικά υψηλότερη από την προεπιλεγμένη τιμή, συχνά πρέπει να εξετάσετε το ενδεχόμενο αύξησης άλλων παραμέτρων, όπως το μέγεθος της προσωρινής μνήμης πίνακα και ο αριθμός των ανοιχτών αρχείων που επιτρέπει η MySQL. Ωστόσο, αυτό υπερβαίνει το πεδίο εφαρμογής αυτού του άρθρου.) 

Κλειδί βελτιστοποίησης MySQL # 4: Διατηρήστε τη βάση δεδομένων στη μνήμη

Έχουμε δει μια μετάβαση σε μονάδες στερεάς κατάστασης (SSD) τα τελευταία χρόνια. Παρόλο που τα SSD είναι πολύ ταχύτερα από την περιστροφή σκληρών δίσκων, εξακολουθούν να μην ταιριάζουν με τα διαθέσιμα δεδομένα στη μνήμη RAM. Αυτή η διαφορά δεν προέρχεται μόνο από την ίδια την απόδοση αποθήκευσης, αλλά και από την επιπλέον εργασία που πρέπει να κάνει η βάση δεδομένων όταν ανακτά τα δεδομένα από δίσκο ή SSD.

Με τις πρόσφατες βελτιώσεις υλικού, είναι όλο και πιο πιθανό να αποθηκεύσετε τη βάση δεδομένων σας στη μνήμη - είτε εκτελείτε στο cloud είτε διαχειρίζεστε το δικό σας υλικό.

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

Μπορεί να έχετε δει κάποια άρθρα που παρέχουν ορισμένους συγκεκριμένους αριθμούς σχετικά με το τμήμα της βάσης δεδομένων που πρέπει να διατηρείτε στη μνήμη, από 10% έως 33%. Στην πραγματικότητα, δεν υπάρχει αριθμός "ένα μέγεθος για όλους". Ο όγκος των δεδομένων που χωρά στη μνήμη για το καλύτερο πλεονέκτημα απόδοσης σχετίζεται με τον φόρτο εργασίας. Αντί να ψάχνετε για έναν συγκεκριμένο «μαγικό» αριθμό, θα πρέπει να ελέγξετε πόσο I / O λειτουργεί η βάση δεδομένων στη σταθερή της κατάσταση (συνήθως λίγες ώρες μετά την εκκίνησή της). Κοιτάξτε τις αναγνώσεις, επειδή οι αναγνώσεις μπορούν να εξαλειφθούν εντελώς εάν η βάση δεδομένων σας είναι στη μνήμη. Τα γραπτά θα πρέπει πάντα να συμβαίνουν, όση ποσότητα μνήμης έχετε.

Παρακάτω μπορείτε να δείτε το I / O να συμβαίνει στο InnoDB I / O Graph στον πίνακα ελέγχου InnoDB Metrics του Percona Monitoring and Management.

Περόνα

Στο παραπάνω γράφημα, βλέπετε αιχμές έως 2.000 λειτουργίες I / O ανά δευτερόλεπτο, κάτι που δείχνει ότι (τουλάχιστον για ορισμένα τμήματα του φόρτου εργασίας) το σύνολο εργασίας της βάσης δεδομένων δεν ταιριάζει καλά στη μνήμη.

Κλειδί βελτιστοποίησης MySQL # 5: Χρησιμοποιήστε χώρο αποθήκευσης SSD

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

$config[zx-auto] not found$config[zx-overlay] not found