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.