Кеширане заявки MySQL - статия за

Запитване за кеширане подобрява производителността на приложенията, без да потъва в структурата на самите искания. Ще разгледаме вграден MySQL заявка за кеширане механизъм и алтернативен подход за случаите, когато вградения механизъм е неприложим.

Вграден кеширане заявки механизъм в MySQL.

MySQL предоставя вграден механизъм за кеширане на заявката, което обаче не е активирана по подразбиране. Това са настройките по подразбиране, изложени в MySQL 5.0:

MySQL> покажи променливи, като например "query_cache%";
+------------------------------+---------+
| variable_name | Цена |
+------------------------------+---------+
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 0 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
+------------------------------+---------+

За да се даде възможност на кеш заявка, и го изберете под 32 мегабайта памет, можете да стартирате на снимачната площадка заявка @@ global.query_cache_size = 32 * 1024 * 1024; като корен, и да се направи тази настройка постоянно, трябва да се добави към подраздел в my.cnf [Mysqld] линия query_cache_size = 32m. Вторият полезен параметър - query_cache_limit определя максималния размер на резултата от заявка, които могат да бъдат поставени в кеша

След включване на кеша тя работи автоматично:

  • Когато всеки тип заявка SELECT изчислява хеш низ сума на заявката и търсения в своята кеш. Ако намери - ruzeltat връща от кеша - ако не, изпълнява заявката, а резултатите се записват в кеш паметта (ако резултатът вече не е query_cache_limit стойности).
  • За всяка молба тип UPDATE, сменете, вмъкване, изтриване, съкращава или ALTER, премахва от кеша на всички заявки, като използват маса в процес на обновяване.

Обърнете внимание на следните характеристики на кеша:

  • Разликата се определя буквално искания, които отговарят на регистъра за сравнение. Ето защо, SELECT * FROM новини и изберете * FROM новини ще кешира две различни искания.
  • Кешът винаги се получава в резултат на заявката като цяло, резултатите от под-заявки, които не са кеширани.
  • Cache работи по същия начин за заявки за търсене в таблици с различни двигатели за съхранение. MySQL също кешира SELECT запитвания към представителствата (Изглед).
  • Редица въпроси не може да се кешира:
    • Исканията, които съдържат един от не-детерминирани функции: NOW (), SLEEP (), RAND (), CurTime (), LAST_INSERT_ID () и други пулсиращ
    • Заявки с помощта на функции или запомнени процедури, дефинирани.
    • Заявки с персонализирани стойности или локални променливи.
    • Заявки, които имат достъп до базата данни MySQL, INFORMATION_SCHEMA или performance_schema.
    • Запитвания за достъп до таблици, разпределени в дялове (както на MySQL версия 1.5.63, 5.5.23, 5.6.5).
    • Заявки като SELECT. ЗА сверяването, изберете. На дела MODE, изберете. В OUTFILE, изберете. В DumpFile, SELECT * FROM. КЪДЕ autoincrement_col е нула.
    • Заявки с помощта на временни таблици.
    • Заявки, които не се котират на масите.
    • Заявки, които генерират предупреждения (предупреждения).
    • Ако потребителят няма права за цялата таблица, но само до определена колона на таблицата. Това изключение - се дължи на факта, че една заявка кеш за всички потребители, както и средствата за кеш права за достъп се проверяват само на нивото на масата.

Като пример за въпрос, който може да се кешира, ние даваме на искането, генерира списък на обсъжданията в webew.ru началната страница:

SELECT т. *, # 40; SELECT тялото от лица, в които J = t.lastid # 41; тяло
ОТ
# 40; SELECT e2.type, e2.id, e2.title, e2.active,
броене # 40; * # 41; - АКО # 40; e2.type = 3. 1. 0 # 41; CNT, MAX # 40; e.id # 41; lastid, MAX # 40; e.created # 41; lastcreated
ОТ лица д
НАЛЯВО JOIN лица e2
ON e2.id = IF # 40; e.foreparent, e.foreparent, e.id # 41;
КЪДЕТО e.active = 1 и e2.active = 1 и e.type = 3
GROUP BY e2.id
ORDER BY MAX # 40; e.created # 41; DESC LIMIT 10 # 41; т
ORDER BY lastcreated DESC

Забележка: Ако променлива система отнема query_cache_wlock_invalidate OFF, заключване на таблицата за запис не изчистите кеширани заявки, свързани с масата. В този случай, чрез кеш заявка ще бъде възможно да се получат данни от заключеното масата.

Сегашното състояние на кеша

Преглед на състоянието на кеш паметта, можете да използвате запитването:

  • Qcache_free_memory - сумата, заделена памет на кеша.
  • Qcache_hits - броят на исканията изпълнени от кеша.
  • Qcache_inserts - вмъква броя заявки към кеша.
  • Qcache_lowmem_prunes - броят на пресата на паметта, дължащи се на пълнотата на кеша.
  • Qcache_not_cached - броя на исканията, които не могат да бъдат кеширани.
  • Qcache_queries_in_cache - броят на исканията в кеша сега.

Мярка за ефективността на кеша е връзката Qcache_hits / (Qcache_inserts + Qcache_not_cached).

Как да се избегне използването на кеш паметта?

В някои случаи е желателно да не се използва кеша. две ситуации са най-често срещаните:

  • Можете да направите заявките, които не се повтарят точно и не искат да се зареди кеша.
  • Можете да направите заявка за оптимизация и искате да се измери времето на неговата екзекуция.

За да изпълни заявката, без да използва кеш паметта се използва директива SQL_NO_CACHE, която се поставя веднага след SELECT изявлението. Например:

SELECT SQL_NO_CACHE номер, заглавие, автор, от новинарския където подобно съобщение "% гумен%";

Забележка. Ако сървърът изпълнява голям брой бързи заявки, кеш паметта може да има отрицателно въздействие върху производителността. Тъй като исканията кеш obrabytyvaet само последователно, свързани с него част от заявката ще използва само един процесор ядро. Ако кеш паметта води до ниска ефективност, тя трябва да бъде прекратен в конфигурационния файл.

Алтернативни методи за кеширане

Въпреки факта, че вградените кеш заявка е мощен и ясен механизъм в някои случаи, това не е приложимо. Ние се опише най-често:

  • Заявката използва потребителските функции, но все пак е determenisticheskim.
  • Оптимизиране на под-заявки трябва да се раздели по искане на две с използването на временни таблици.
  • Таблицата се актуализира често, обезсилване на кеш паметта, но това не е задължително да направи реалната извадка.
  • Таблицата се актуализира често полета, които не се използват в заявката (което все още ще обезсили кеша на заявката за таблицата).

Да предположим, че на масата често obnovalyaetsya, но ние се актуализира информацията на достатъчно основни пъти в минута. Представяме лесен начин за ръчно кешира заявка с MEMORY-маса. Ако резултатът се съхранява в паметта на кръговете в рамките на минута, ние ще се изпълни заявката и показва резултатите в паметта-масата.

На първо място, ако една маса с кеширани резултати не по-стари от една минута се проверява там:

SELECT # 40; create_time> сега # 40; # 41; - ИНТЕРВАЛ 1 минута # 41; прясно ОТ cache_mainpage_query ГРАНИЦА 1;

Анализирайте свеж стойност в резултат на низ. Ако е възникнала пресни = 0 или грешка, а след това искане трябва да се извършва и да направи MEMORY-таблица:

DROP TABLE Ако не съществува "cache_mainpage_query";
Създаване на таблица cache_mainpage_query ДВИГАТЕЛ = MEMORY
SELECT сега # 40; # 41; AS create_time. ОТ. КЪДЕ. ORDER BY. LIMIT. ;

След това, както е в случая на с = 0, а в случай на с = 1, трябва да изпълним искането и да се върне в резултат на клиента:

SELECT * FROM cache_mainpage_query ORDER BY. ;

Забележка. В този пример за създаването на маса се съхранява във всяка линия на временна таблица (create_time колона). Това е неефективно за ранг в паметта, така че ако паметта се превръща в пречка трябва да бъде преместен, докато кеширане в отделна таблица.

Ако правило е сортиране комплекс (например изисква свързване на допълнителни таблици или изчисления на полета), а след това сортиране кеширана заявката отнема време. За да избегнете това, когато номера на реда основната заявка:

SET Стх: = 0;
Създаване на таблица cache_mainpage_query ДВИГАТЕЛ = MEMORY
SELECT сега # 40; # 41; AS create_time, Стх: = @ в една AS РСР. ОТ. КЪДЕ. ORDER BY. LIMIT. ;

Пробата в този случай е по-лесно:

SELECT * ОТ cache_mainpage_query РЕД ОТ РСР;

С ПАМЕТ-маси свързан един ограничение: в тези таблици не може да се съхранява поле от тип BLOB / ТЕКСТ. Ако искате да съхраните този тип поле, можете да създадете MEMORY маса изрично с полета от тип VARCHAR () до 65,535 герои, или да използвате тип MyISAM маса.