Index MySQL: quando crearli

Cos'e un'indice

Un'indice MySQL e una struttura dati (B-tree o hash) che permette di trovare righe velocemente senza scansionare l'intera tabella. Senza indice, MySQL fa full table scan: O(N). Con indice opportuno, O(log N). Su tabella con milioni di righe, la differenza e tra millisecondi e minuti.

Quando creare un'indice

Colonne usate in WHERE frequentemente. Colonne in JOIN. Colonne in ORDER BY o GROUP BY. Foreign key (anche se MySQL InnoDB crea automaticamente). Colonne con alta selettivita (molti valori distinti). Mai indicizzare colonne booleane o status con pochi valori (selectivity bassa, indice inutile).

Indici compositi

CREATE INDEX idx ON table(col_a, col_b, col_c). Usabile per WHERE su col_a, (col_a, col_b), (col_a, col_b, col_c). NON usabile per WHERE solo su col_b o col_c (regola left-most prefix). Ordina le colonne nell'indice per selectivita (più selettiva prima). Considera tipi di query reali.

Covering index

Un covering index include TUTTE le colonne necessarie alla query (SELECT + WHERE + JOIN + ORDER BY). MySQL legge solo l'indice, mai la tabella. Velocissimo. EXPLAIN mostra Using index in Extra. Per query frequentissime su tabella enorme, vale lo spazio extra.

Costo degli indici

Ogni indice rallenta INSERT, UPDATE, DELETE: deve aggiornare anche le strutture indice. Storage extra: indice su tabella 10GB puo essere 2-3GB. Cache buffer pool occupato. NON creare indici a caso "perché male non fa": tabelle write-heavy degradano. Bilancia tra read e write.

Manutenzione indici

SHOW INDEX FROM table mostra tutti gli indici esistenti. pt-duplicate-key-checker (Percona) identifica indici ridondanti. Schema_unused_indexes (sys schema) trova indici mai usati: candidati a DROP INDEX. ANALYZE TABLE aggiorna statistiche per ottimizzatore. OPTIMIZE TABLE rebuilds (per InnoDB usa ALTER TABLE ... FORCE).

Indici WordPress critici

wp_posts: type_status_date (composito), post_parent, post_author, post_name. wp_postmeta: post_id, meta_key. wp_options: autoload. WooCommerce: wp_wc_order_stats, wp_wc_product_meta_lookup hanno indici dedicati. Plugin Index WP MySQL For Speed aggiunge indici critici per WordPress su larga scala.

Hai bisogno di aiuto?

Se vuoi un sito veloce ottimizzato dal team di G Tech Group, scrivici tramite il modulo di contatto.

Hai trovato utile quest'articolo?