Der Buffer Pool ist der Ort, an dem InnoDB Daten und Indizes im Arbeitsspeicher hält. Passt Ihr Arbeitsdatensatz hinein, werden Abfragen aus dem RAM beantwortet. Passt er nicht, lesen dieselben Abfragen die Platte — und das ist für dieselbe Arbeit hundert- bis tausendmal langsamer.
Sehen, was Sie haben
mysql -e "SELECT @@innodb_buffer_pool_size/1024/1024/1024 AS gb"
Die Voreinstellung ist 128 MB. Auf einem Server mit 8 GB RAM ist das die Einstellung, die von allem auf der Maschine am meisten Leistung ungenutzt liegen lässt.
Wie groß Ihre Daten tatsächlich sind
SELECT ROUND(SUM(data_length + index_length)/1024/1024/1024, 2) AS gb
FROM information_schema.tables WHERE engine = 'InnoDB';
Die Zahl wählen
- Dedizierter Datenbankserver — 60 bis 70 % des RAM.
- Geteilt mit PHP und dem Webserver — 25 bis 40 %, und achten Sie auf Swapping.
- Daten kleiner als das — bemessen Sie ihn nach den Daten plus ein wenig; alles darüber ist verschenkt.
# /etc/mysql/mysql.conf.d/mysqld.cnf
innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 4 # one per GB, up to 8
innodb_log_file_size = 512M
Prüfen, ob er groß genug ist
mysql -e "SHOW STATUS LIKE 'Innodb_buffer_pool_read%'"
Teilen Sie die Lesevorgänge, die auf die Platte mussten, durch alle Leseanfragen. Unter etwa 1 % ist gesund; dauerhaft mehr heißt, der Pool ist für den Arbeitsdatensatz zu klein.
Bemessen Sie ihn nicht so, dass die Maschine swappt. Eine swappende Datenbank ist deutlich langsamer als eine mit kleinem Buffer Pool — siehe RAM, Swap und wann Swap ein Symptom ist.
Bevor Sie mehr Speicher kaufen, prüfen Sie, ob die Abfragen vernünftig sind. Ein einziger fehlender Index kann einen Arbeitsdatensatz zehnmal größer erscheinen lassen, als er ist — siehe Wann man einen Index anlegt.