it-swarm-eu.dev

MySQL table_cache a Opened_tables

Viděl jsem, jak lidé používají porovnání Open_tables a Opened_tables k posouzení, zda tabulka_cache je v MySQL příliš malá. Věřím však, že Opened_tables je kumulativní v průběhu provozuschopnosti, takže to není platné srovnání. Jedinou námitkou, že snad Opened_tables, je narážka na slečny - i když i když jsou tabulky, které se otevírají za sekundu, stále malé, pravděpodobně není problém, aby rostla postupně.

Pokud není porovnání Open_tables s Opened_tables platné, existuje pro to jiný způsob, jak získat naměřená data?

Toto je na MySQL 5.0, ale rozdíly mezi verzemi jsou také vítány.

14
Sam Brightman

Největší důvod, proč mít velký table_cache, je tak, že LOCK_open mutex není horké. MySQL starší než 5.5 má při pokusu o otevření/zavření tabulek mnoho sporů, takže to chcete omezit na maximum, tj. Mít velkou tabulkovou mezipaměť.

Takže vám nezáleží na konkrétním poměru zásahů k mírám (protože byste měli ignorovat poměry úplně - tento blogový příspěvek vysvětluje proč ). To, na čem vám záleží, je míra chyb , protože čím více se to stane za sekundu, tím vyšší je šance, že budete mít soupeření (jedno vlákno musí počkejte, až zámek uvolní další vlákno.)

Jak si všimnete míry slečny? Během nejrušnějšího dne dne načtete několik vzorků Opened_Tables po několika sekundách od sebe, a pokud se v každém vzorku zvýší, pravděpodobně je dobrý nápad zjistit, zda můžete narazit na tabulku table_cache.

Poznámka: Velmi konkrétně nedoporučuji porovnání s uptime.

7
Morgan Tocker

Nejprve se podívejme na tyto stavové proměnné:

Otevřené tabulky : Počet otevřených tabulek.

Otevřené tabulky : Počet otevřených tabulek. Pokud jsou tabulky Opened_tables velké, je vaše hodnota table_open_cache pravděpodobně příliš malá.

Překvapivě odpověď na vaši otázku leží v samotné otázce.

Tyto dvě proměnné by měly větší smysl, pokud hodíte do mixu ještě jednu stavovou proměnnou: ptime (nebo ptime_since_flush status pro nové průměry po FLUSH STATUS =).

Měli byste porovnávat Open_tables agsinst (Open_tables/Uptime) . Pokud Open_tables stoupá výše (Opened_tables/Uptime) , nyní máte důvod k obavám a měli byste mít oči otevřené pro věci jako následující:

AKTUALIZACE 2011-08-31 12:18 EDT

Vezměte prosím na vědomí, proč jsem také navrhl použít Uptime_since_flush_status namísto Uptime k získání opravit vzorec růstu Opened_tables pro dané období.

Pokud například spustíte FLUSH STATUS; každé pondělí o půlnoci můžete vygenerovat OpenTableFactor:

SELECT *, (Open_tables * Uptime / Opened_Tables) OpenTableFactor FROM
(SELECT variable_value Uptime FROM information_schema.global_status
WHERE variable_name = 'Uptime_since_flush_status') up,
(SELECT variable_value Open_tables FROM information_schema.global_status
WHERE variable_name = 'Open_tables') opn,
(SELECT IF(variable_value=0,1,variable_value) Opened_tables
FROM information_schema.global_status
WHERE variable_name = 'Opened_tables') opnd;

Tento faktor otevřené tabulky se rovná počtu, který představuje počet otevřených tabulek v daném okamžiku proti průměrnému počtu otevřených tabulek v daném období. S FLUSH HOSTS; každý týden/den/hostitel, tento průměr je proti týdnu/dni/hodině.

Zde je ukázka jednoho z klientů mého zaměstnavatele:

mysql> SELECT *, (Open_tables * Uptime / Opened_Tables) OpenTableFactor FROM     (SELECT variable_value Uptime FROM information_sc    hema.global_status     WHERE variable_name = 'Uptime_since_flush_status') up,     (SELECT variable_value Open_tables FROM informat    ion_schema.global_status     WHERE variable_name = 'Open_tables') opn,     (SELECT IF(variable_value=0,1,variable_value) Opened_ta    bles     FROM information_schema.global_status     WHERE variable_name = 'Opened_tables') opnd;
+----------+-------------+---------------+-------------------+
| Uptime   | Open_tables | Opened_tables | OpenTableFactor   |
+----------+-------------+---------------+-------------------+
| 14385123 | 16326       | 30429078      | 7717.996519579068 |
+----------+-------------+---------------+-------------------+
1 row in set (0.00 sec)

Tento klient obvykle udržuje asi 7745 OpenTableFactor na max. Pokud OpenTableFactor náhle poklesne (i když trochu), může to znamenat nižší dopravní vzorce, vysoké potraty a tak dále. Pokud se OpenTableFactor nikdy nezmění (i když trochu), může vám nabídnout příležitost změnit tato nastavení:

Po nastavení se může OpenTableFactor neustále měnit nebo zasáhnout jiný strop nebo plošinu. Tudíž použití různých jednotek ve stavových proměnných je pro tento druh ladění životně důležité.

UPDATE 2011-08-31 12:42 EDT

Dotaz SQL, který jsem spustil pro OpenTableFactor, nefunguje pro MySQL 5.0 a zpět. Pokud používáte MySQL Administrator nebo MONyog , můžete přizpůsobit graf pomocí vzorce v dotazu a monitoru. MONyog shromažďuje historii pomocí SQLLite pro pozdější historické grafy. To lze provést pro jakoukoli verzi MySQL.

5
RolandoMySQLDBA

Z jednoho z uživatelských komentářů na stránce table_cache dokumentace:

Opened_tables je stavová proměnná, která udržuje průběžný součet počtu dalších deskriptorů souborů, které byly přiděleny pro otevírání tabulek v době, kdy byly vyčerpány dostupné popisovače souborů v tabulce tablecacache. ...

Znamená to, že se zvyšuje, když přejdete nad svou hodnotu table_cache. Takže způsob, jakým to normálně kontroluji, je porovnat opened_tables S uptime, ale klíčem je zde převzít to přes nastavený interval (například jednou za minutu, například přes deset minut). Pokud se zvyšuje , může znamenat, že musíte zvýšit svůj table_cache.

Pár upozornění:

  • Další komentář v této dokumentaci výše: „Stavová proměnná 'Opened_tables' se také zvýší o 2 při každém vytvoření dočasné tabulky.“ Pokud vaše dotazy vyžadují mnoho dočasných tabulek, mohlo by to být příčinou rychlého nárůstu opened_tables. Vaše dočasné použití tabulky můžete vidět pomocí následujícího dotazu:

    SHOW GLOBAL STATUS LIKE '%tmp%';

  • Nezvyšujte tabulku table_cache příliš vysoko

    Důvodem takového chování je, že pokud máte velké ne. u tabulek s komplikovanými dotazy spojujícími několik tabulek a více připojení, které tyto komplikované dotazy spouští, můžete skončit pomocí mezipaměti všech deskriptorů souborů (table_cache), v tomto případě MySQL použije algoritmus k nalezení naposledy použitého deskriptoru, jeho uzavření a nahrazení s novým deskriptorem.

3
Derek Downey