Was soll innodb_buffer_pool gesetzt werden und warum ..?


20

Ich habe 170 GB InnoDBIndex und Daten.

Ich muss die innodb_buffer_pool-Größe für eine bessere Leistung neu anpassen. Die maximale Tabellengröße einer InnoDB-Tabelle (Index + Daten) beträgt 28 GB.

Also, was sollte die optimale Größe von innodb_buffer_pool sein.

AKTUALISIEREN

Wir werden diese lokale Datenbank auf ec2 migrieren, also wird der RAM gemäß der aktuellen Statistik von innodb eingestellt. Deshalb benötige ich die Größe des Pufferpools, damit wir dort verfügbaren RAM haben können.

Datei pro Tabelle ist aktiviert.

Ich benutze Linux-Maschine.


Was ist der verfügbare Arbeitsspeicher auf dem Computer, der nicht von anderen Prozessen verwendet wird? Verwenden Sie Windows, Linux oder etwas anderes? Welche Version von MySQL verwenden Sie? Warum ist die Tischgröße auf 28 GB beschränkt?
Craig Efrein

Die Tischgröße ist nicht begrenzt. Ich habe die Tischgröße bis zu einem Zeitpunkt angegeben. Sie wird sich erhöhen, da es in Zukunft Einfügungen geben wird.
Abdul Manaf

Antworten:


25

Die größte Tabelle, die Sie haben, macht 16,47% (28/170) der Gesamtdaten aus. Selbst wenn die Tabelle in hohem Maße geschrieben und gelesen wurde, werden nicht alle 28 G der Tabelle zu einem bestimmten Zeitpunkt in den Pufferpool geladen. Sie müssen lediglich berechnen, wie viel des InnoDB-Pufferpools zu einem bestimmten Zeitpunkt auf dem aktuellen DB-Server geladen ist .

Hier finden Sie eine detailliertere Methode zum Ermitteln von "innodb_buffer_pool_size" für einen neuen DB-Server unter Berücksichtigung des Datasets, das derzeit im InnoDB-Pufferpool des aktuellen DB-Servers geladen ist.

Führen Sie auf Ihrer aktuellen MySQL-Instanz (Server, von dem Sie migrieren) Folgendes aus:

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data';  -- IBPDataPages 
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total'; -- IBPTotalPages
SHOW GLOBAL STATUS LIKE 'Innodb_page_size'; -- IPS

Führen Sie die Formel aus IBPPctFull = IBPDataPages * 100.0 / IBPTotalPages.

SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPTotalPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total'); -- SELECT @IBPTotalPages;
SET @IBPPctFull = CAST(@IBPDataPages * 100.0 / @IBPTotalPages AS DECIMAL(5,2));
SELECT @IBPPctFull;

Wenn IBPPctFull 95% oder mehr beträgt, sollten Sie innodb_buffer_pool_size auf 75% des Arbeitsspeichers des DB-Servers festlegen.

Wenn IBPPctFull weniger als 95% ist, führen Sie diese Formel: IBPSize = IPS X IBPDataPages / (1024*1024*1024) X 1.05.

SET @IBPSize = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_page_size'); -- SELECT @IBPSize;
SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPSize = concat(ROUND(@IBPSize * @IBPDataPages / (1024*1024*1024) * 1.05, 2), ' GB' );
SELECT @IBPSize;

Die Nummer für IBPSize (in GB) ist die Nummer, die Ihrem tatsächlichen Arbeitsdatensatz besser entspricht.

Wenn IBPSize für die größte Amazon EC2-RAM-Konfiguration noch zu groß ist, verwenden Sie 75% des RAM für den Amazon EC2-DB-Server.


Das sind wirklich großartige Informationen. Eine weitere Sache, die ich wissen muss, wie der MySQL Server die Daten und Indizes in den Pufferpool lädt. Ich habe die Dokumentation durchgesehen und festgestellt, dass es LRU verwendet, aber wie es sie in den Speicher lädt, als hätte ich 2 GB für Pufferpool, aber die Tabellengröße, die in der Abfrage angefordert wird, ist viel mehr als das .. ??
Abdul Manaf

Nur die Daten- und Indexseiten, die zur Erfüllung der Abfrage benötigt werden, werden in den Pufferpool geladen, nicht die gesamte Tabelle. Alte Daten- und Indexseiten werden basierend auf dem in dev.mysql.com/doc/refman/5.5/de/innodb-buffer-pool.html
RolandoMySQLDBA

Abdul, du solltest Rolando antworten, was deine Frage besser beantwortet als meine. Ich werde meine eigene Antwort umschreiben, nur weil ich klarer sein muss.
Craig Efrein

13

Ich stelle diese Antwort als ergänzende Information zu Rolando unten zur Verfügung.

Bevor der Server in Produktion ist

Berechnen Sie innodb_buffer_pool_size basierend auf den größten Tabellen, die von MySQL am häufigsten verwendet werden. Mit dem folgenden Skript können Sie die größten Tabellen anhand ihrer Größe in der Datenbank identifizieren:

select table_schema, table_name, round(data_length/1024/1024,2) as size_mb 
from information_schema.tables where table_schema like 'my_database' 
order by size_mb desc;


+--------------+-------------------------+---------+
| table_schema | table_name              | size_mb |
+--------------+-------------------------+---------+
| heavybidder     | user                 |   522.55|
| heavybidder     | bid                  |   121.52|
| heavybidder     | item_for_sale        |    10.52|
| heavybidder     | account_user         |    5.02 |
| heavybidder     | txn_log              |    4.02 |
| heavybidder     | category             |    0.02 |
+--------------+-------------------------+---------+

Nachdem wir wissen, welche Tabellen in unserer Datenbank die größten sind, müssen wir ermitteln, welche Tabellen am häufigsten verwendet werden. Zu diesem Zweck würde ich ein Profilierungsprogramm wie Jet Profiler (JP) verwenden, um festzustellen, auf welche Tabellen am häufigsten zugegriffen wird. JP zeigt Ihnen, auf welche Tabellen am häufigsten zugegriffen wird. Hier ist ein Screenshot aus diesem Abschnitt in JP

Bildbeschreibung hier eingeben

Aus diesem Grund weiß ich jetzt, dass die Benutzer- und Gebotstabellen ungefähr 640 MB Speicherplatz beanspruchen, sie werden laut JP sehr häufig verwendet, und das bedeutet, dass MySQL ihre Indizes und Daten als Rolando im Pufferpool speichern wird Erwähnungen unten in seinen Kommentaren.

Um sicherzustellen, dass MySQL über genügend Speicher verfügt, um Daten für meine größten und am häufigsten verwendeten Tabellen zu speichern, würde ich dann innodb_buffer_pool_size mit 640 MB definieren.

Es gibt einige zusätzliche Überlegungen, die jedoch nicht für innodb_buffer_pool_size gelten.

Ist das ein 32Bit oder 64Bit System? In einem 32-Bit-System sind Sie auf 4 GB beschränkt, sofern Sie PAE nicht aktivieren. In Windows bedeutet dies, dass Windows Enterprise- oder Datacenter-Editionen ausgeführt werden.

Wie viel Arbeitsspeicher benötigen die anderen auf Ihrem System ausgeführten Prozesse? Auf einem dedizierten MySQL-Server lasse ich zwischen 5% und 10% für das Betriebssystem. In Windows können Sie mit Process Explorer die Speichernutzung analysieren. Unter Linux gibt es sysstat, free, htop, top und vmstat.

Besteht die Datenbank nur aus Innodb-Tabellen oder aus einer Mischung von Innodb und MyISAM? Wenn es sich um eine Mischung aus beidem handelt, werde ich Speicher für den key_cache reservieren, Variablen verknüpfen, den Cache abfragen usw. Sie können später Ihre MyISAM-Trefferquote berechnen, sobald der Server in Betrieb ist.

Nachdem der Server in Produktion ist

Was ist die aktuelle Trefferquote für Innodb?

1 - (innodb_buffer_pool_reads / innodb_buffer_pool_read_requests).

Was ist die Schlüssel-Cache-Trefferquote?

1 - (Key_reads / Key_read_requests)

Normalerweise versuche ich, das Verhältnis so nahe wie möglich an 100% zu bringen.

Wie gut passen Ihre Tabellen in den Pufferpool?

Sie können auch sehen, wie gut Ihre Tabellendaten in Ihren buffer_pool passen, indem Sie auf diesen Link verweisen, der eine Möglichkeit bietet, zu zeigen, "wie viele Seiten sich im Pufferpool für eine gegebene Tabelle (cnt) befinden, wie viele davon verschmutzt (dirty) sind. , und wie viel Prozent des Index passen in den Speicher (fit_pct). " Gilt nur für Percona-Server

http://www.mysqlperformanceblog.com/2010/12/09/how-well-does-your-table-fits-in-innodb-buffer-pool/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.