Mysql
 sql >> база данни >  >> RDS >> Mysql

Защо innodb SHOW TABLE STATUS е толкова ненадежден?

Официалната документация за 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();

който връща правилния общ ред в таблицата на предишната кеширана заявка.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Индекс на PostgreSQL срещу индекс InnoDB - Разбиране на разликите

  2. Вложени коментари в PHP и MySQL

  3. Spring 3 MVC + MySQL:не може да съхранява символ €

  4. Получаване на съобщение SQLEXCEPTION в MySQL процедури

  5. Синхронизирано изпълнение на съхранени процедури в mysql