Ho esperienza con MS SQL server dove è possibile e utile per update statistic e rebuild indexes. Non riesco a trovare questa opzione in MySQL innoDB, esiste questa opzione? In caso negativo, in che modo il database MySQL crea un piano di esecuzione? MySQL aggiorna gli indici e le statistiche con ogni UPDATE e INSERT?Come posso ricostruire gli indici e aggiornare le statistiche in MySQL innoDB?
risposta
Questo viene fatto con
ANALYZE TABLE table_name;
Per saperne di più su di esso here.
ANALYZE TABLE analizza e memorizza la distribuzione delle chiavi per un tavolo. Durante l'analisi, la tabella è bloccata con un blocco di lettura per MyISAM, BDB e InnoDB. Questa dichiarazione funziona con le tabelle MyISAM, BDB, InnoDB e NDB.
Perché? Non è quasi mai necessario aggiornare le statistiche. Ricostruire un indice è ancora più raramente necessario.
OPTIMIZE TABLE tbl;
ricostruisce gli indici e fa ANALYZE
; richiede tempo.
ANALYZE TABLE tbl;
è veloce per InnoDB ricostruire le statistiche. Con 5.6.6 è ancora meno necessario.
Non sono d'accordo con questa risposta. Passando attraverso una vecchia tabella, di circa 300.000 righe, ho aggiornato un paio di colonne in un indice e l'indice conteneva ancora i vecchi valori precedenti all'aggiornamento. Ho lasciato cadere l'indice e l'ho ricreato e poi ha funzionato bene. MySQL 5.7.10 – Adergaard
@Adergaard - Come hai fatto a sapere che l'indice conteneva ancora i vecchi valori? (Questo potrebbe portare a un bug report.) –
Come @Adergaard, anche io non sono d'accordo. Nel mio caso una query che utilizza un indice di fulltext era molto lenta (sembrava che fosse stata utilizzata la ricerca dell'indice completo). Le prestazioni sono migliorate solo dopo aver rilasciato e ricreato l'indice. MySQL 5.6.31. Vorrei che ci fosse un qualche tipo di ricostruzione solo per gli indici, come in Oracle: 'ALTER INDEX ... REBUILD;'. –
È anche possibile utilizzare lo strumento CLI fornito mysqlcheck
per eseguire le ottimizzazioni. Ha uno ton of switches ma nella sua forma più elementare è sufficiente passare il database, il nome utente e la password.
Aggiungendo questo a cron o all'Utilità di pianificazione di Windows, è possibile impostare come automated process. (MariaDB, ma fondamentalmente la stessa cosa.)
Perfetto, questo è esattamente quello che stavo cercando. – qub1n
Per MyISAM, comporta una scansione completa della tabella; potenzialmente lento. Per InnoDB, sono alcune sonde veloci. –