Perché le righe restituite da “explain” non è uguale a count ()?

mysql> select count(*) from table where relation_title='xxxxxxxxx'; +----------+ | count(*) | +----------+ | 1291958 | +----------+ mysql> explain select * from table where relation_title='xxxxxxxxx'; +----+-------------+---------+- | id | select_type | rows | +----+-------------+---------+- | 1 | SIMPLE | 1274785 | +----+-------------+---------+- 

Penso che “spiega select * dalla tabella dove relation_title = ‘xxxxxxxxx’;” restituisce le righe di relation_title = ‘xxxxxxxxx’ per indice. Ma è piccolo rispetto al vero numero.

Mostra quante righe ha eseguito per ottenere il risultato.

Il motivo dei dati errati è che EXPLAIN non è accurato, fa ipotesi sui tuoi dati in base alle informazioni memorizzate sulla tua tabella.

Si tratta di informazioni molto utili, ad esempio quando si esegue l’operazione JOIN su più tabelle e si desidera essere sicuri di non eseguire l’intera tabella unita per una riga di informazioni per ciascuna riga in uso.

Ecco un test su un tavolo 608 righe.

 SELECT COUNT(id) FROM table WHERE user_id = 1 

Risultato:

 COUNT(id) 512 

Ed ecco la spiegazione

 EXPLAIN SELECT COUNT(id) FROM table WHERE user_id = 1 

Risultato:

 id rows 1 608 

La query EXPLAIN utilizzerà il valore fornito nella tabella INFORMATION_SCHEMA , che contiene una stima approssimativa del conteggio delle righe per le tabelle innodb: vedere la sezione delle note nei documenti mysql su INFORMATION_SCHEMA.TABLES .

Esegui ANALYZE TABLE table_name; – aggiornerà le statistiche utilizzate da EXPLAIN e otterrai i numeri corretti. Ad esempio: quando non ci sono dati nella tabella, EXPLAIN suggerisce che questa tabella è vuota e ottimizza le query per filtrare prima in base a quella tabella (poiché non legge nulla da disco, memoria e così via). Quindi quando i dati verranno caricati se non si esegue ANALYZE TABLE table_name; , l’ottimizzatore suggerisce ancora che la tabella è ancora vuota e non utilizza un piano di esecuzione ottimale per la query. EXPLAIN si comporta allo stesso modo – non cerca il numero attuale di righe nella tabella, cerca le statistiche generate dal ANALYZE TABLE table name (che viene eseguito automaticamente in alcune situazioni – ad esempio 1/16 del numero di righe nella tabella modificato) .