Perché le righe stimate sono molto diverse nei risultati di phpmyadmin?

Senza alcuna modifica sul database, ho ottenuto un numero di file molto diverso nei miei tavoli.

Cosa può causare questo?

inserisci la descrizione dell'immagine qui

inserisci la descrizione dell'immagine qui

Server version: 5.1.63-cll Engine: InnoDB 

A differenza delle tabelle MyISAM, le tabelle InnoDB non tengono traccia di quante righe contiene la tabella.

Per questo motivo, l’unico modo per conoscere il numero esatto di righe in una tabella InnoDB consiste nell’esaminare ogni riga della tabella e accumulare un conteggio. Pertanto, su tabelle InnoDB di grandi dimensioni, l’esecuzione di una SELECT COUNT(*) FROM innodb_table query SELECT COUNT(*) FROM innodb_table può essere molto lenta perché esegue una scansione completa della tabella per ottenere il numero di righe.

phpMyAdmin utilizza una query come SHOW TABLE STATUS per ottenere un conteggio stimato del numero di righe nella tabella dal motore (InnoDB). Poiché si tratta solo di una stima, varia ogni volta che viene chiamata, a volte le variazioni possono essere abbastanza grandi e talvolta sono vicine.

Ecco un post informativo informativo su COUNT (*) per i tavoli InnoDB di Percona.

La pagina di manuale MySQL per SHOW TABLE STATUS afferma:

Il numero di righe. Alcuni motori di archiviazione, come MyISAM, memorizzano il conteggio esatto. Per altri motori di archiviazione, come InnoDB, questo valore è un’approssimazione e può variare dal valore effettivo fino al 40-50%. In questi casi, utilizzare SELECT COUNT (*) per ottenere un conteggio accurato.

La pagina sulle restrizioni InnoDB va in maggior dettaglio:

SHOW TABLE STATUS non fornisce statistiche accurate sulle tabelle InnoDB, ad eccezione delle dimensioni fisiche riservate dalla tabella. Il conteggio delle righe è solo una stima approssimativa utilizzata nell’ottimizzazione SQL.

InnoDB non mantiene un conteggio interno delle righe in una tabella perché le transazioni simultanee potrebbero “vedere” diversi numeri di righe contemporaneamente. Per elaborare SELECT COUNT(*) FROM t , InnoDB esegue la scansione di un indice della tabella, che richiede un po ‘di tempo se l’indice non è interamente nel bufferpool. Se la tua tabella non cambia spesso, usare la cache di query MySQL è una buona soluzione. Per ottenere un conteggio veloce, devi utilizzare un tavolo contatore che crei te stesso e lasciare che la tua applicazione lo aggiorni secondo gli inserti e lo cancelli. Se è sufficiente un conteggio di righe approssimativo, è ansible utilizzare SHOW TABLE STATUS . Vedere la Sezione 14.3.14.1, “Suggerimenti per l’ottimizzazione delle prestazioni InnoDB” .

phpMyAdmin utilizza un metodo rapido per ottenere il conteggio delle righe e questo metodo restituisce un conteggio approssimativo solo nel caso delle tabelle InnoDB.

Vedi $cfg['MaxExactCount'] per un modo per modificare quei risultati, ma questo potrebbe avere un grave impatto sulle prestazioni.