La documentazione
di MySQL 5.1 ufficiale riconosce che InnoDB non fornisce statistiche accurate con SHOW TABLE STATUS
. Mentre le tabelle MYISAM mantengono specificamente una cache interna di metadati come il numero di righe ecc., il motore InnoDB memorizza sia i dati delle tabelle che gli indici in */var/lib/mysql/ibdata**
InnoDB non ha un file di indice conveniente che consenta una rapida query sui numeri di riga.
I numeri di riga della tabella incoerenti vengono segnalati da SHOW TABLE STATUS
perché InnoDB stima dinamicamente il valore 'Righe' campionando un intervallo di dati della tabella (in */var/lib/mysql/ibdata**) e quindi estrapola il numero approssimativo di righe. Tanto che la documentazione di InnoDB riconosce l'imprecisione del numero di riga fino al 50% quando si utilizza SHOW TABLE STATUS
La documentazione di MySQL suggerisce di utilizzare la cache delle query MySQL per ottenere query con numero di riga coerenti, ma i documenti non specificano come . Segue una breve spiegazione di come farlo.
Innanzitutto, controlla che la memorizzazione nella cache delle query sia abilitata:
mysql> SHOW VARIABLES LIKE 'have_query_cache';
Se il valore di have_query_cache è NO quindi abilita la cache delle query aggiungendo le seguenti righe a /etc/my.cnf e quindi riavvia mysqld.
have_query_cache=1 # added 2017 08 24 wh
query_cache_size = 1048576
query_cache_type = 1
query_cache_limit = 1048576
(per ulteriori informazioni, vedere http://dev.mysql. com/doc/refman/5.1/en/query-cache.html )
Interroga il contenuto della cache con
mysql> SHOW STATUS LIKE 'Qcache%';
Ora usa SQL_CALC_FOUND_ROWS
istruzione in un SELECT
domanda:
SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table
SQL_CALC_FOUND_ROWS
tenterà una lettura dalla cache e, se questa query non viene trovata, eseguirà la query sulla tabella specificata e quindi eseguirà il commit del numero di righe della tabella nella cache della query. Ulteriori esecuzioni della query di cui sopra (o altri SELECT
'cachebili' istruzioni - vedi sotto) consulterà la cache e restituirà il risultato corretto.
Successiva 'cachable' SELECT
domande
- anche se LIMIT
il risultato - consulterà la cache delle query e ti consentirà di ottenere (solo una volta) i numeri di riga della tabella totale con
SELECT FOUND_ROWS();
che restituisce il totale di righe di tabella corrette della query memorizzata nella cache precedente.