sql >> Databáze >  >> RDS >> Mysql

Proč je STAV SHOW TABLE STATUS innodb tak nespolehlivý?

Oficiální MySQL 5.1 dokumentace bere na vědomí, že InnoDB neposkytuje přesné statistiky pomocí SHOW TABLE STATUS . Zatímco tabulky MYISAM specificky uchovávají interní mezipaměť metadat, jako je počet řádků atd., engine InnoDB ukládá data tabulky i indexy do */var/lib/mysql/ibdata**

InnoDB nemá žádný vhodný indexový soubor umožňující rychlý dotaz na čísla řádků.

Nekonzistentní čísla řádků tabulky jsou hlášena pomocí SHOW TABLE STATUS protože InnoDB dynamicky odhaduje hodnotu 'Rows' vzorkováním rozsahu dat tabulky (v */var/lib/mysql/ibdata**) a poté extrapoluje přibližný počet řádků. Natolik, že dokumentace InnoDB uznává nepřesnost čísel řádků až o 50 % při použití SHOW TABLE STATUS

Dokumentace MySQL navrhuje použití mezipaměti dotazů MySQL k získání konzistentních dotazů na čísla řádků, ale dokumenty neurčují jak . Následuje stručné vysvětlení, jak toho lze dosáhnout.

Nejprve zkontrolujte, zda je povoleno ukládání dotazů do mezipaměti:

mysql> SHOW VARIABLES LIKE 'have_query_cache';

Pokud je hodnota have_query_cache je NE poté povolte mezipaměť dotazů přidáním následujících řádků do /etc/my.cnf a poté restartujte mysqld.

have_query_cache=1    # added 2017 08 24 wh
query_cache_size  = 1048576
query_cache_type  = 1
query_cache_limit = 1048576

(Další informace viz http://dev.mysql. com/doc/refman/5.1/en/query-cache.html )

Dotaz na obsah mezipaměti pomocí

mysql> SHOW STATUS LIKE 'Qcache%';

Nyní použijte SQL_CALC_FOUND_ROWS příkaz v SELECT dotaz:

SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table

SQL_CALC_FOUND_ROWS pokusí se o čtení z mezipaměti, a pokud tento dotaz nebude nalezen, provede dotaz proti zadané tabulce a poté odešle počet řádků tabulky do mezipaměti dotazů. Další provedení výše uvedeného dotazu (nebo jiného „cachovatelného“ SELECT příkazy – viz níže) zkontroluje mezipaměť a vrátí správný výsledek.

Následující 'cachable' SELECT dotazy - i když LIMIT výsledek – nahlédne do mezipaměti dotazů a umožní vám získat (pouze jednorázově) celková čísla řádků tabulky pomocí

SELECT FOUND_ROWS();

která vrátí správný součet řádků tabulky předchozího dotazu uloženého v mezipaměti.



  1. python:jak získat upozornění na změny databáze mysql?

  2. Jak omezit výsledky v MySQL, PostgreSQL a SQLite

  3. Jak mohu seskupit na spojité rozsahy

  4. Složený index pro tabulku vztahů