Cache, hantering i mysql

From Linuxwiki
Jump to navigation Jump to search

Hantering av cache i MySQL

Cache innebär som bekant att lagra återkommande uppgifter för snabbare åtkomst. I MySQL är det resultatet av select-satser som lagras och det görs i serverns minne istället för att hämtas från disk varje gång. Detta är avstängt som standard. Inställningarna görs i my.cnf under [mysqld]. T ex query_cache_size = 32M som ger 32 MB cache.

Status

För att ta reda på status hos nuvarande cache skriver man

show status like 'qcache%';
Detta ger t ex:
+-------------------------+------------+
| Variable_name           | Value      |
| Qcache_free_blocks      | 5216       |
| Qcache_free_memory      | 14640664   |
| Qcache_hits             | 2581646882 |
| Qcache_inserts          | 360210964  |
| Qcache_lowmem_prunes    | 281680433  |
| Qcache_not_cached       | 79740667   |
| Qcache_queries_in_cache | 16927      |
| Qcache_total_blocks     | 47042      |
+-------------------------+------------+
8 rows in set (0.00 sec)

Qcache_free_blocks

Antal sammanhängande minnesblock i cachen. Ett högre värde indikerar desto mer fragmenterad har cachen blivit. För att defragmentera: flush query cache och ett stort sammanhängande block skapas.

Qcache_free_memory

Totalt ledigt minne i cachen.

Qcache_hits

Visar hur ofta cachen använts istället för diskläsning. Räknas upp med ett varje gång ett resultat kan hämtas ur cachen.

Qcache_inserts

Räknas upp varje gång ett resultat lagras i cachen, dvs när resultatet inte kunde hämtas från cachen.

För att räkna ut felfaktorn, dvs missarna, dividera Qcache_inserts med Qcache_hits.

Qcache_inserts / Qcache_hits = 360210964 / 2581646882 = 0.13 (ca)

För att sen få träffsäkerheten: 1 - 0.13 = 0.87 Det vill säga, ca 87 procent av frågorna hämtas från cachen.

Qcache_lowmem_prunes

Anger hur ofta minnet i cachen tagit slut. I sådana lägen städas cachen ur för att göra plats åt nya resultat. Bäst är att titta på detta värde över en viss tid. Om det ökar är det ett tecken på fragmentering eller för lite minne avsatt till cachen.

Qcache_not_cached

Antalet frågor som inte kan läggas i cachen. Vanligtvis beroende på att dessa inte är select-satser

Qcache_queries_in_cache

Antalet frågor (och svar) som finns i cachen för stunden.

Qcache_total_blocks

Antalet block som utgör cachen.

Tolkning och hantering

De flesta värden gör sig bäst av att undersökas över en viss tidsperiod för att se förändringar. Man kan resetta de flesta räknarna ovan med kommandot flush status.

Att sätta en väldigt stor cache för att hantera så mycket som möjligt kan verka som en bra ide. Dock måste en cache hanteras av databaservern och en stor cache tar längre tid att hantera än en mindre. Dessutom kan man förbruka systemresurser vilket gör servern slöare. Om kommandot flush query cache tar lång tid har man troligen en för stor cache.