Официалната документация
за MySQL 5.1 потвърждава, че InnoDB не дава точни статистически данни с SHOW TABLE STATUS
. Докато таблиците MYISAM специално поддържат вътрешен кеш на метаданни, като брой редове и т.н., InnoDB двигателя съхранява както данни за таблицата, така и индекси в */var/lib/mysql/ibdata**
InnoDB няма подходящ индексен файл, позволяващ бърза заявка за номера на редове.
Непоследователните номера на редовете в таблицата се отчитат от SHOW TABLE STATUS
тъй като InnoDB динамично оценява стойността на „Редове“, като взема проби от диапазон от данни на таблицата (в */var/lib/mysql/ibdata**) и след това екстраполира приблизителния брой редове. Дотолкова, че документацията на InnoDB признава неточност на номера на редове до 50% при използване на SHOW TABLE STATUS
Документацията на MySQL предлага използването на кеша на заявките на MySQL за получаване на последователни заявки с номера на редове, но документите не уточняват как . Следва кратко обяснение как може да се направи това.
Първо проверете дали кеширането на заявки е активирано:
mysql> SHOW VARIABLES LIKE 'have_query_cache';
Ако стойността на have_query_cache е НЕ след това активирайте кеша на заявките, като добавите следните редове към /etc/my.cnf и след това рестартирайте mysqld.
have_query_cache=1 # added 2017 08 24 wh
query_cache_size = 1048576
query_cache_type = 1
query_cache_limit = 1048576
(за повече информация вижте http://dev.mysql. com/doc/refman/5.1/en/query-cache.html )
Запитване за съдържанието на кеша с
mysql> SHOW STATUS LIKE 'Qcache%';
Сега използвайте SQL_CALC_FOUND_ROWS
израз в SELECT
заявка:
SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table
SQL_CALC_FOUND_ROWS
ще се опита да прочете от кеша и, ако тази заявка не бъде намерена, изпълни заявката към посочената таблица и след това зареди броя на редовете на таблицата в кеша на заявката. Допълнителни изпълнения на горната заявка (или друга 'кешируема' SELECT
изявления - вижте по-долу) ще се консултира с кеша и ще върне правилния резултат.
Следващ 'cachable' SELECT
запитвания
- дори ако те LIMIT
резултатът - ще се консултира с кеша на заявките и ще ви позволи да получите (само еднократно) общите номера на редовете в таблицата с
SELECT FOUND_ROWS();
който връща правилния общ ред в таблицата на предишната кеширана заявка.