MySQL: Кеширование средствами


Кэширование MySQL "включается" двумя параметрами:

# Это общий объем кеша
query_cache_size=32M

# Это максимальный объем одного запроса, который можно помещать в кеш
query_cache_limit=1M

Посмотреть текущие настройки можно следующим запросом:

> SHOW VARIABLES LIKE 'query_cache%';

И он выдаст что-то типа:

+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 8192     |
| query_cache_size             | 33554432 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+

Также есть возможность посмотреть, насколько кэш эффективен -
попадают ли вообще туда запросы и в каком количестве.
Делается это командой:

> SHOW GLOBAL STATUS LIKE 'Qcache%';

которая покажет что-то вроде:

+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 973      |
| Qcache_free_memory      | 14282000 |
| Qcache_hits             | 3293750  |
| Qcache_inserts          | 252819   |
| Qcache_lowmem_prunes    | 0        |
| Qcache_not_cached       | 66645    |
| Qcache_queries_in_cache | 1342     |
| Qcache_total_blocks     | 3709     |
+-------------------------+----------+

Самые главные параметры здесь, это

* Qcache_hits - количество запросов, выбранных из кэша
* Qcache_not_cached - количество запросов, которые не кэшируются
* Qcache_inserts - количество запросов, помещенных в кэш

Эти величины позволяют оценить полезность кэша MySQL на практике.

Следует отметить, что при вставке или обновлении таблицы -
кэш запросов к ней сбрасывается и становится неэффективен,
если вставки идут постоянно.


== Замечание 1 ==

С помощью MEMORY-таблиц, можно сделать кэширование более эффективным.
К примеру, результат запроса можно поместить в таблицу "InMemory",
добавить столбец - "свежесть" выборки.

CREATE TABLE my_cache_table ENGINE=MEMORY
    SELECT now() AS created, id, ... FROM table ...

После того, как выборка окажется "не свежей", эту таблицу легко уничтожить
(DROP TABLE) и сделать другую такую же - но с новыми данными.

== Замечание 2 ==

В MySQL-запросе можно "силовым" методом указать, что кэш использовать не нужно:

SELECT SQL_NO_CACHE some_fields FROM some_table


#