Um mit den Cache-Parametern herumspielen zu können, müssen wir uns mit 'root'-Rechten einloggen. Zunächst schauen wir nach, welche Optionen MySQL überhaupt kennt. Wir können dazu einfach 'show variables' eingeben; allerdings erhalten wir dabei eine Riesenliste, und müssten die interessanten Werte mühsam herausklauben. Einfacher geht es mit dem folgenden Befehl:
mysql> show variables like '%cache%'; +-----------------------+------------+ | Variable_name | Value | +-----------------------+------------+ | binlog_cache_size | 32768 | | have_query_cache | YES | | max_binlog_cache_size | 4294967295 | | query_cache_limit | 1048576 | | query_cache_size | 0 | | query_cache_type | ON | | table_cache | 64 | | thread_cache_size | 0 | +-----------------------+------------+ 8 rows in set (0.00 sec)
Konkret möchte ich den Wert 'query_cache_size' vorstellen. Damit können wir erreichen, dass MySQL einen bestimmten Speicherbereich reserviert, um einmal beantwortete 'select'-Anfragen temporär zwischenzuspeichern. Das bringt ab der zweiten Abfrage ganz massiv schnellere Resultate, weil die Informationen direkt aus dem Speicher kommen. Damit wir uns davon überzeugen können, schalten wir zunächst den Cache mal ein:
mysql> set global query_cache_size = 10000000; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'query_cache_size'; +------------------+---------+ | Variable_name | Value | +------------------+---------+ | query_cache_size | 9999360 | +------------------+---------+ 1 row in set (0.01 sec)
Die Differenz von einigen Bytes (im Beispiel 640 Bytes) sollte uns nicht weiter beunruhigen, letztlich braucht die Verwaltung auch noch einige Bytes. Damit wir den Effekt veranschaulichen können, sollten wir Zugang zu einer möglichst grossen Datensammlung haben.
Ich habe versprochen, dass wir die Tabelle 'cachetest' nicht umsonst erstellt haben; nun ist die Zeit gekommen und wir öffnen die Tabelle 'cachetest' nochmals wie untenstehend:
mysql> use archiv; Database changed mysql> select count(*) from cachetest order by ID desc; +----------+ | count(*) | +----------+ | 100000 | +----------+ 1 row in set (0.18 sec) mysql> select count(*) from cachetest order by ID desc; +----------+ | count(*) | +----------+ | 100000 | +----------+ 1 row in set (0.00 sec)
Was erkennen wir daraus? Bei der ersten Abfrage haben wir eine Reaktionszeit von 0.18 Sekunden erreicht, bei der zweiten Abfrage haben wir 0.00 Sekunden erhalten. Ok, irgendwelche Millisekunden wird auch diese Abfrage gebraucht haben, aber letztlich ist die zweite Abfrage schneller, weil das Resultat direkt aus dem Cache kommt.
Der Effekt kann verstärkt gezeigt werden, indem das Demoprogramm 'halloperl.pl' einige Male hintereinander gestartet wird (noch einfacher setzen wir im Programm selber den Zählobergrenze für $c entsprechend hoch), sodass wir weit mehr Datensätze für die Abfrage haben.