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

Perché lo SHOW TABLE STATUS di innodb è così inaffidabile?

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.