Tech Life

Ilustrační obrázek

Použití cache v MySQL dotazech

31. 03. 2008 00:00    kategorie: Tech Life    autor: JPo    komentářů: 2

Přiznám se, že jsem si dlouhou dobu myslel, že SQL_NO_CACHE v mysql dotazu vyvolá, že volaný dotaz nebude používat cache (tj. např zjistím, jak dlouho reálně trvá).
 

Teprve při přečtení dokumentace jsem zjistil, že chování je malinko odlišné. Co přesně znamenají tyto volitelné parametry v mysql SELECT dotazu?

  • SQL_CACHE - po provedení ulož výsledek do cache (pokud je to možné)
  • SQL_NO_CACHE - po provedení neukládej výsledek do cache

Tj. druhá varianta neříká nic o tom, co se stane, pokud již dotaz v cache je. Experimentálně mám ověřeno, že se z cache načte. Tj. SQL_NO_CACHE vám nezaručí, že se cache nepoužije, a např. při ladění, že čas, který dotaz trval, je reálný.

K tomu je dobré si nejprve cache vypráznit pomocí RESET QUERY CACHE a poté používat jen SQL_NO_CACHE dotazy (viz dokumentace).

Poznámka pod čarou:

Už to dříve někdo psal. Docela zajímavý parametr je i SQL_CALC_FOUND_ROWS, která pro dotazy s LIMIT vrátí i počet výsledků před omezením - SELECT FOUND_ROWS(). Vhodné zvláště při tvorbě výpisu se stránkováním (tj. na každém druhém etn projektu :) ).

Nadějně vypádá i SQL_BUFFER_RESULT, kterým se vynutí použití odkládacích tabulek a údajně se tím ulehčí při zamykání tabulek.

SQL_BUFFER_RESULT forces the result to be put into a temporary table. This helps MySQL free the table locks early and helps in cases where it takes a long time to send the result set to the client.

Sdílet odkaz:
tisk

Diskuze k článku

David Kolář, 23.5.2011 12:51

Stejně tak nedoporučuji používat SQL_CALC_FOUND_ROWS u tabulek, která má více než 10x víc záznamů než je LIMIT dotaz. Je výhodnější provést COUNT(*) na všechno a potom (nebo předtím) dotaz na LIMIT ... Při COUNT(*) MySQL prohledává pouze index a počítá většinou jen jednu tabulku, zatímto SQL_CALC_FOUND_ROWS pročítá i reálné řádky z disku, řadí všechny výsledky, nejen limitované a připojuje připojované tabulky na každém řádku. Udělejte si testy, je to výrazně pomalejší varianta.

David Kolář, 23.5.2011 12:48

Tady nemáte pravdu ... prostudujte si jak cache dotazů funguje ... MySQL pouze provede kontrolní součet dotazu (hash) a ten hledá v cache. Protože každá malinká změna dotazu má za následek úplně jiný hash/otisk, tak vzhledem k tomu že se dotaz se SQL_NO_CACHE nikdy do cache neuloží, nemůže tam existovat ani jeho otisk. Pokud je tam stejný dotaz bez tohoto parametru, má jiný otisk a je považován za jiný. Dejte si také pozor, protože mezera ve SQL dotazu (např. 2 mezery za select) nepoužijí cache, pokud je v ní stejný dotaz obsahující na tomto místě jen jednu mezeru! Pište proto SQL dotazy vždy unifikovaně, abyste mohli cache využít naplno.

Přidat příspěvek

 

Kontakt pro média


Máte zájem o další informace, odborný článek či přednášku na konferenci? Kontaktujte nás prosím na pr@etnetera.cz.

RSS - Tech life


RSS kanál Tech Life Blogu

Offlineblog

Offlineblog

Ljama


Komix z prostředí imaginární firmy.

ljama

Ještě jste ho nečetli? Tak tudy ...

 
Doporučujeme: Nabídka práce, volná pracovní místa - pracovní portál SPRÁVNÝKROK.CZ