Friday, September 3, 2010

SemanticBlog

all about web innovation

MySQL Key Buffer Optimierung

Posted by Christian On Januar - 25 - 2010

Der MySQL KEY-BUFFER

Die wohl wichtigste Einstellung, welche in der my.cnf eines MySQL-Server vorgenommen werden sollte, ist die key_buffer_size.
Ein hoher key_buffer sorgt dafür, dass die Verarbeitung der Indizes Ihrer Tabellen direkt über den RAM-Speicher erfolgen kann,
was natürlich ein Geschwindigkeitsvorteil gegenüber dem Filesystem ist.

Der Wert dieser Variablen sollte so gewählt werden, dass der key_buffer zwischen 25% und 50% des gesamten Systemspeichers benutzt.
Die Hauptvoraussetzung hierfür ist, dass es sich um einen dedizierten Datenbank-Server handelt.
Falls neben der MySQL-Datenbank noch ein Apache-Server installiert ist, sollte der Wert eher kleiner gehalten werden.
Sollten die Indizes ihrer Tabellen viel kleiner sein als 25% – 50% des vefügbaren RAMs, können Sie den Wert ebenfalls entsprechend kleiner setzen.


Gesetzt werden kann der Key-Buffer übrigens im laufenden Betrieb mit folgendem Befehl (Anbei ein Beispiel für einen key_buffer der Größe 80MB):
mysql> SET GLOBAL key_buffer_size=80*1024*1024;

Berechnung der KEY-Buffer-Größe:

Um einen Überblick über die aktuelle Leistung ihre Systems zu erhalten, ist es ratsam sich anzeigen zu lassen,
wie oft auf das Filesystem zugegriffen werden muss, um die Schlüssel der Indizes einzulesen.


Der nachfolgende Begfehl zeigt Ihnen diese Zahl in Abständen von 10 Sekunden. Falls sie den Vorgang über einen längeren Zeitraum beobachten wollen,
setzen Sie beispielsweise -i auf 100.
$ mysqladmin extended-status -uadmin -p -r -i 10 | grep Key_reads
| Key_reads | 4516933
| Key_reads | 12
| Key_reads | 10
| Key_reads | 36
| Key_reads | 4
| Key_reads | 54
| Key_reads | 37
| Key_reads | 82

Sollten die ausgegeben Zahlen recht klein sein, stellt das noch kein Problem für die Performance Ihres MySQL-Servers da.
Ab etwa 75-100 Key_reads in der Sekunde ist es jedoch ratsam, den key_buffer (falls möglich) anzupassen.


Falls der key_buffer nicht richtig eingestellt ist, werden die Schlüssel Ihrer Indizes genauso behandelt,
wie die Datenblöcke Ihrer Tabellen, welche über das Filesystem eingelesen werden. Sollte das passieren, wird
die Benutzung von Indizes nahezu überflüssig. Die Indizes müssen aus dem RAM kommen!


Wenn Sie wissen wollen, wie viel Speicher letztendlich dem key_buffer-Caches zugewiesen werden soll,
könnte es helfen zu wissen, wie viel Platz Ihr MyISAM-Indizes sind tatsächlich auf der Festplatte verbrauchen.


Dies kann mit diesem Befehl ermittelt werden:
$ du -sch `find /var/lib/mysql/meinedatenbank/ -name “*.MYI”`

150,0M /var/lib/mysql/meinedatenbank/tabelle1.MYI
890,0M /var/lib/mysql/meinedatenbank/tabelle2.MYI
10,0M /var/lib/mysql/meinedatenbank/tabelle3.MYI
950,0M /var/lib/mysql/meinedatenbank/tabelle4.MYI
2,0G insgesamt



Für die weitergehenden Berechnungen zum key_buffer benötigen Sie einige Variablen, die in die Rechnungen mit einfließen:

mysql> SHOW VARIABLES LIKE ‘key_%’;
+————————–+————-+
| Variable_name | Value
+————————–+————-+
| key_buffer_size | 147372182
| key_cache_age_threshold | 200
| key_cache_block_size | 2048
| key_cache_division_limit | 100
+————————–+————-+
4 rows in set (0.00 sec)

mysql> SHOW STATUS LIKE ‘Key_%’;
+————————+——————+
| Variable_name | Value
+————————+——————+
| Key_blocks_not_flushed | 0
| Key_blocks_unused | 9
| Key_blocks_used | 125235
| Key_read_requests | 19886434342
| Key_reads | 8451382
| Key_write_requests | 57643111
| Key_writes | 2473240
+————————+—————–+
7 rows in set (0.00 sec)

Die Formeln zur Berechnung des Cache hit ratio beziehungsweise des benutzen Buffers lauten:

Cache hit ratio
100 – ( (Key_reads * 100) / Key_read_requests )


Percentage of buffer in use
100 – ( (Key_blocks_unused * key_cache_block_size) * 100 / key_buffer_size )

Anbei eine Beispielrechnung:

Cache hit ratio:
100 – ((8451382 * 100) / 19886434342 ) =
100 – 0,042498227 = 99,957501773 %


Sollte dieser Wert unter 95% fallen, ist dies definitiv nicht gut. Am Besten sind Werte in der 99,99% – Region.

Percentage of buffer in use:
100 – ( (9 * 2048 ) * 100 / 147372182 ) =
100 – ( (18432 / 167772160 ) =
100 – 0,000109863 = 99,999890137 % !


Wenn der Buffer zu 99,99.. ausgenutzt wird, ist dies ein gutes Zeichen, andererseits könne man sich Gedanken machen diesen etwas zu erhöhen.
Es sind einige Test und etwas ausprobieren notwendig, bis die optimalen Einstellungen gefunden sind.

Coole MySQL Tuning Skripts

Posted by Christian On Dezember - 15 - 2009

Wundern Sie sich, weshalb Ihre MySQL-Datenbank in letzter Zeit so langsam ist? Mit mehr Benutzern und Einträgen ist es ab und an erforderlich, die
globalen Konfigurationsparameter anzupassen, langsame Abfragen zu identifizieren oder die Abfragen an sich zu verändern.

Zum Glück gibt es einige nützliche Programme, die Sie bei diesem Vorhaben unterstützen können:

  1. Zur Analyse von slow-query log-Dateien: mysqlsla
  2. maatkit
  3. Analysiert die Datenbank und macht Verbesserungsvorschläge:Tuning-Primer.sh
  4. MySQL Tuner

Zur Funktionsweise von maatkit:
Ich habe es bislang nur benutzt, um langsame Queries zu analysieren. Dabei sind folgende Aufrufe nützlich.
Vorher sollte eine Datei query.sql erstellt werden, in der die entsprechende Abfrage abgespeichert wird.
mk-visual-explain –host hostname –user username –password passwort –database databankname -c query1.sql >> query1_data.txt
mk-query-profiler –host hostname –user username –password passwort –database databankname query1_data.txt >> query1_data.txt

Installiert werden kann maatkit entweder über sudo apt-get install maatkit oder einem Download bei google-code.

Articles and books about PHP-MySQL Performance

Posted by Christian On Juli - 21 - 2009

A small linklist with tipps to improve the performance of LAMPP-XAMPP-based systems. The focus is on PHP and MySQL optimization. I am going to extend the article step by step.

MySQL-Volltextsuche beschleunigen mit Sphinx

Posted by Christian On Juli - 4 - 2009

Volltextsuche auf stark frequentierten Webseiten führt unter MySQL oftmals zu Performanceproblemen. Die Verwendung von Sphinx könnte einen Ausweg darstellen.
Sphinx ist eine freie open-source Volltextsuchengine, die in C++ implementiert und beispielsweise mit Apache Lucene vergleichbar ist. Die Installation gestaltet sich recht einfach.

Das Tutorial Build a custom search engine with PHP erklärt schnell die Vorteile von Sphinx. Verschiedene Tabellen werden über mehrere Joins verknüpft und ein View auf die Abfrage erzeugt. Dieser wird mit Hilfe von Sphinx indiziert und kann so wesentlich(!) schneller abgefragt werden, als es nur mit MySQL möglich ist. Ein weiterer Pluspunkt ist die einfache Unterstützung von PHP über eine API.

Die Erzeugung von Indices kostet natürlich auch ein wenig Zeit. Deshalb eignet sich Sphinx vor allem für Daten, welche sich nicht ständig ändern. Doch es ist möglich, mehrere Indices mit unterschiedlichen Triggern zu generieren. Eine Idee wäre zum Beispiel ein Trigger, der über einen Cron-Job alle sechs Stunden aufgerufen wird um den Hauptindex zu erzeugen sowie ein kleinerer Deltaindex, welcher mit kürzerem Zeitintervall arbeitet, um die Benutzer nicht zu lange warten zu lassen.

Es wird gemunkelt, dass mit der Version 0.9.9 inkrementelles Indizieren unterstützt wird, was einen großen Schritt in Richtung Benutzerfreundlichkeit darstellt.

Weitere Infos:

  • Ein Videobeitrag, der die Möglichkeiten der Software auslotet.
  • Für diejenigen, welche Ihren Wordpress-Blog selbst hosten, könnte dieses Plugin relevant sein: https://launchpad.net/wp-sphinx-plugin/+download
  • Performancestatistiken
  • Präsentation

O’Reillys High Performance MySQL: Optimierung, Datensicherung & Lastverteilung widmet Sphinx ein eigenes Kapitel und ist eine erstklassige Referenz, um sich intensiv mit MySQL-Performancesteigerung auseinanderzusetzen.

Das Sphinx einen Blick wert ist, beweist die Nominierung zu den Community Choice Awards bei Sourceforge 2009

Interessante Artikel: Ein Vergleich von Open Source Suchmaschinen…

A Comparison of Open Source Search Engines

Thinking Sphinx: Searching By Location And Keyword

PHP-Extension erstellen

Sphinx-Beschreibung bei PHP.net

Crontab, Server-Startupskript

Wer tiefer in die Materie einsteigen möchte und sich für speziellere Themen, wie zum Beispiel Wildcardsuche oder Suche ausschließlich in vorher festgelegten Datenbankfeldern interessiert sollte einen Blick auf folgenden Artikel werfen: Suchen mit Wildcards und nur in definierten Feldern mit Sphinx… .

Blogverzeichnis - Blog Verzeichnis bloggerei.de   Blogverzeichnis   Blog and ping   Blog Top Liste - by TopBlogs.de   Bloggeramt.de   Blog Directory   powered by rankingcloud   Internet Multimedia blogs & blog posts  
blog search directory   Blogverzeichnis   Blog Directory   Blog Verzeichnis   Blog Directory   Technology Blogs - Blog Rankings   blogoscoop  

Clicky