Mysql
 sql >> Database >  >> RDS >> Mysql

Perché il conteggio delle righe stimato è molto diverso nei risultati di phpmyadmin?

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 è ispezionare ogni riga della tabella e accumulare un conteggio. Pertanto, su grandi tabelle InnoDB, eseguendo un SELECT COUNT(*) FROM innodb_table la query può essere molto lenta perché esegue una scansione completa della tabella per ottenere il numero di righe.

phpMyAdmin usa una query come SHOW TABLE STATUS per ottenere un conteggio stimato del numero di righe nella tabella dal motore (InnoDB). Poiché è solo una stima, varia ogni volta che la chiami, a volte le variazioni possono essere abbastanza grandi ea volte sono vicine.

Ecco un post sul blog informativo su COUNT(*) per Tabelle InnoDB di Percona.

La pagina di manuale di 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, usa SELECT COUNT(*) per ottenere un conteggio accurato.

La pagina su Restrizioni InnoDB entra più nel dettaglio:

SHOW TABLE STATUS non fornisce statistiche accurate sulle tabelle InnoDB, ad eccezione della dimensione fisica riservata 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 un SELECT COUNT(*) FROM t istruzione, InnoDB scansan l'indice della tabella, che richiede del tempo se l'indice non è completamente nel pool di buffer. Se la tua tabella non cambia spesso, l'uso della cache delle query MySQL è una buona soluzione. Per ottenere un conteggio veloce, devi utilizzare una tabella contatore che crei tu stesso e lasciare che la tua applicazione lo aggiorni in base agli inserti e alle eliminazioni che fa. Se è sufficiente un conteggio approssimativo delle righe, SHOW TABLE STATUS può essere utilizzato.Vedi Sezione 14.3.14.1, "Prestazioni di InnoDB Suggerimenti per l'ottimizzazione" .