2011-11-15 22 views
7

Recentemente ho aggiornato un Joomla! installazione 1,5-1,7 con un ampio set di dati di articoli e mentre il metodo di aggiornamento è stato l'aggiornamento del database (inserimento di contenuti ad un altro tavolo, in fondo) ho notato che la Righe valore della colonna è stato preceduto da una tilde (~):phpMyAdmin - Che cosa significa tilde (~) nella colonna delle righe?

See image

Ora, a prima vista presumo questo significa che il valore è approssimativo perché quando aggiorno la pagina vedo un valore diverso, a volte più alto, a volte più basso. OK, diciamo che il valore è approssimativo, in tal caso, che cosa sta causando? Alcune considerazioni:

  • OS: Windows 7.
  • Server: Apache 2 con PHP 5.3 e MySQL 5.1.50-comunitari.

risposta

11

Il numero di righe è un'approssimazione utilizzato per l'ottimizzazione query InnoDB. fare un conteggio (*) è molto più inefficiente e avere un'idea approssimativa del numero di righe è sufficiente per ottimizzare il piano di query. phpMyAdmin farà una query "Mostra stato tabella" per ottenere le informazioni relative alla tabella:

http://dev.mysql.com/doc/refman/5.0/en/show-table-status.html

Per gli altri motori di archiviazione, come InnoDB, questo valore è un approssimazione, e può variare da il valore effettivo da 40 a 50%. In questi casi, utilizzare SELECT COUNT (*) per ottenere un conteggio accurato.

+0

Grazie a bencoder, quindi controllerò se è conveniente cambiare il motore di archiviazione. Apprezzo il vostro aiuto. –

+0

Prego. Non riesco a capire perché sia ​​necessario. Stai facendo affidamento su questo output di phpmyadmin per qualcosa? Probabilmente sarebbe molto meglio scrivere una pagina specifica che ti dia il valore corretto usando count (*) – bencoder

+0

Non disegnare la conclusione errata. La configurazione non è interrotta e non è necessario modificare il motore di archiviazione. –

1

Quali sono i tipi di tabella? Le tabelle MyISAM memorizzano un numero esatto di righe nei loro metadati. Le tabelle InnoDB non possono, poiché il numero esatto delle righe varia a seconda di quali transazioni sono in "in volo", quindi il conteggio mostrato per esse è contrassegnato come stima (~ = "approssimativamente") invece di "è esattamente questo numero" ".

+0

Grazie Marc, sono InnoDB. –

7

Secondo il MySQL Manual on InnoDB restrictions:

  • SHOW TABLE STATUS non dà statistiche precise sul InnoDB tavoli, tranne che per la dimensione fisica riservata dalla tabella. Il conteggio delle righe è solo una stima approssimativa utilizzata nell'ottimizzazione SQL.

  • InnoDB non impedisce un conteggio interno di righe di una tabella perché operazioni simultanee potrebbero "vedere" diverso numero di righe contemporaneamente. Per elaborare un'istruzione SELECT COUNT(*) FROM t, InnoDB deve eseguire la scansione di un indice della tabella, che richiede un po 'di tempo se l'indice non è interamente nel pool di buffer. 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, è possibile utilizzare SHOW TABLE STATUS. Vedere la Sezione 13.2.13.1, "InnoDB Performance Tuning Tips".

Secondo la page per SHOW TABLE STATUS, visualizzato InnoDB rowcounts possono variare dal conteggio effettivo fino al 50%.

+0

Non è niente di preciso. –

+0

Non penso che quella parola significhi cosa tu pensi che significhi. –

+0

Vedo, è solo un riferimento. –