MySQL Indice: Tutorial su come creare, aggiungere e rilasciare

โšก Riepilogo intelligente

MySQL Questo tutorial sugli indici spiega come gli indici ordinano e individuano rapidamente i dati. Un indice รจ una struttura di ricerca ordinata creata su una o piรน colonne; il comando CREATE INDEX lo aggiunge, SHOW INDEXES lo esamina e DROP INDEX lo rimuove quando il numero di operazioni di scrittura sulle tabelle supera i vantaggi derivanti dalle operazioni di lettura.

  • ๐Ÿ“š Tratta gli indici come un dizionario: Ordinano i valori delle colonne in modo che il motore possa individuare le righe senza dover scansionare l'intera tabella.
  • ๏ธ Creare al tavolo o successivamente: Definisci un indice direttamente nel comando CREATE TABLE oppure aggiungilo in seguito con CREATE INDEX su una tabella esistente.
  • ๐Ÿ” Ispeziona con MOSTRA INDICI: Utilizza SHOW INDEXES FROM table_name per elencare tutti gli indici, le parti della chiave, la cardinalitร  e i flag di unicitร .
  • ๐Ÿงน Elimina quando il costo di scrittura รจ troppo elevato: Gli indici rallentano le operazioni di INSERT e UPDATE: elimina quelli non utilizzati con DROP INDEX per recuperare la velocitร  di scrittura.
  • ๐Ÿค– Utilizzare l'intelligenza artificiale per la progettazione degli indici: Gli assistenti basati sull'IA leggono i log delle query lente, suggeriscono l'ordine delle colonne per gli indici compositi e spiegano i piani di esecuzione di EXPLAIN riga per riga.

MySQL Concetto di indice

Che cos'รจ un MySQL Indice?

An Index in MySQL Un indice รจ una struttura dati che memorizza i valori delle colonne in modo ordinato, consentendo al motore di ricerca di risalire rapidamente nelle righe. Gli indici vengono creati sulla colonna o sulle colonne utilizzate piรน frequentemente per filtrare i dati. Si puรฒ pensare a un indice come a un elenco ordinato alfabeticamente: trovare un nome in un elenco ordinato รจ molto piรน veloce che trovarlo in un elenco non ordinato.

Gli indici comportano un compromesso: ogni operazione di INSERT o UPDATE deve mantenere l'indice, quindi aggiungere troppi indici su una tabella con molte operazioni di scrittura puรฒ compromettere le prestazioni complessive. Come regola generale, รจ preferibile indicizzare le colonne che compaiono nelle clausole WHERE, JOIN e ORDER BY su tabelle che vengono lette piรน spesso di quanto vengano scritte.

Perchรฉ utilizzare un indice?

A nessuno piacciono i sistemi lenti. Le prestazioni elevate sono una prioritร  assoluta per quasi tutte le applicazioni basate su database. Le aziende investono ingenti somme in hardware per garantire la velocitร  delle query, ma esiste un limite a ciรฒ che l'hardware da solo puรฒ offrire. L'ottimizzazione degli indici rappresenta una soluzione piรน economica ed efficace.

MySQL Concetto di indice

I tempi di risposta lenti derivano solitamente dal fatto che le righe vengono memorizzate in ordine fisico sul disco. Senza un indice, MySQL deve scansionare ogni riga per trovare quelle che corrispondono a un predicato โ€” una โ€œscansione completa della tabellaโ€. Gli indici consentono MySQL salta direttamente alle righe corrispondenti, il che trasforma il piano di query da O(n) a circa O(log n) per le ricerche in alberi B.

Sintassi: Crea indice

Un indice puรฒ essere definito in due punti:

  1. Al momento della creazione della tabella.
  2. Dopo che la tabella esiste giร .

Esempio: creare un indice in linea con CREATE TABLE

Per la myflixdb database, ci aspettiamo molte ricerche sulla colonna fullname. Lo script seguente crea un nuovo members_indexed tabella con indice su full_names colonna.

CREATE TABLE `members_indexed` (
    `membership_number` INT(11) NOT NULL AUTO_INCREMENT,
    `full_names`        VARCHAR(150) DEFAULT NULL,
    `gender`            VARCHAR(6)   DEFAULT NULL,
    `date_of_birth`     DATE         DEFAULT NULL,
    `physical_address`  VARCHAR(255) DEFAULT NULL,
    `postal_address`    VARCHAR(255) DEFAULT NULL,
    `contact_number`    VARCHAR(75)  DEFAULT NULL,
    `email`             VARCHAR(255) DEFAULT NULL,
    PRIMARY KEY (`membership_number`),
    INDEX (`full_names`)
) ENGINE = InnoDB;

Eseguire lo script in MySQL Banco da lavoro contro il myflixdb Banca dati.

tabella members_indexed in MySQL banco di lavoro

ricaricare myflixdb per vedere il nuovo members_indexed tavolo. Il full_names la colonna ora appare sotto la Indici nodo.

Man mano che il numero di membri aumenta, le query di ricerca su members_indexed che utilizzano WHERE e ORDER BY contro full_names sono molto piรน veloci delle stesse query sull'originale members tabella senza indice.

Aggiungi un indice dopo che la tabella esiste giร 

Spesso scoprirai che una tabella esistente necessita di un indice: le query di ricerca sono lente e un piano EXPLAIN mostra una scansione completa della tabella su una colonna che appare in WHERE. CREATE INDEX Questa istruzione aggiunge un indice senza ricreare la tabella.

CREATE INDEX `id_index` ON `table_name` (`column_name`);

Esempio concreto: velocizzare le ricerche su title colonna del movies tabella:

CREATE INDEX `title_index` ON `movies` (`title`);

Ogni query che filtra su movies.title Ora รจ supportato dal nuovo indice. Le query che filtrano in base ad altre colonne continuano a scansionare la tabella a meno che non dispongano di un proprio indice.

Nota: รˆ possibile creare un indice composito su piรน colonne quando le query filtrano o ordinano sempre in base alla stessa combinazione. L'ordine รจ importante: la colonna principale determina se l'indice puรฒ essere utilizzato.

Elenca gli indici di una tabella

Usa il SHOW INDEXES per visualizzare tutti gli indici definiti su una tabella.

SHOW INDEXES FROM `table_name`;

Esempio: elenca gli indici su movies tabella:

SHOW INDEXES FROM `movies`;

Eseguire l'istruzione in MySQL banco di lavoro contro di myflixdb per visualizzare gli indici esistenti e le colonne che coprono.

Nota: Le chiavi primarie e le chiavi esterne vengono indicizzate automaticamente da MySQLOgni indice ha un nome univoco e elenca le colonne che comprende.

Sintassi: Drop Index

Usa il DROP INDEX Rimuovere un indice esistente da una tabella. Questa operazione รจ utile quando una tabella con un elevato volume di scritture viene rallentata da un indice che non apporta piรน alcun vantaggio in termini di operazioni di lettura.

DROP INDEX `index_id` ON `table_name`;

Esempio concreto: lascia cadere il full_names indice da members_indexed:

DROP INDEX `full_names` ON `members_indexed`;

Tipi di MySQL Indici

MySQL supporta diversi tipi di indice, ognuno adatto a un carico di lavoro differente.

Tipo Missione
CHIAVE PRIMARIA Identificatore univoco di riga; raggruppato con i dati della tabella in InnoDB.
UNICO Garantisce l'unicitร  e al contempo funge da indice.
INDICE (struttura ad albero B) Indice secondario predefinito utilizzato per le query di intervallo e le ricerche di uguaglianza.
TESTO INTERO Ottimizzato per la ricerca di testo in linguaggio naturale con CONFRONTA โ€ฆ CONTRO.
SPAZIALE Indice R-tree per tipi di dati GIS come PUNTO e POLIGONO.
HASH Ricerche di uguaglianza a tempo costante; utilizzate dal motore di archiviazione MEMORY.
Composito (a piรน colonne) Unisce diverse colonne in un unico indice; rispetta la regola del prefisso piรน a sinistra.

migliori pratiche per MySQL Indici

Le abitudini descritte di seguito mantengono gli indici utili ed evitano che diventino un peso morto.

  • Indice per il modello di query, non per il nome della colonna: Aggiungi indici che corrispondano a clausole WHERE, JOIN e ORDER BY reali, non a "ogni colonna che sembra importante".
  • Guarda l'ordine degli indici compositi: La colonna principale deve comparire nella query affinchรฉ l'indice venga utilizzato.
  • Evitare indici duplicati: Un prefisso iniziale di un indice composito copre giร  le ricerche a colonna singola su tale prefisso.
  • Ispeziona con SPIEGAZIONE: Verificare che il pianificatore stia effettivamente selezionando il nuovo indice.
  • Elimina gli indici non utilizzati: uso sys.schema_unused_indexes in MySQL 5.7+ per trovare indici che non vengono letti da nessuno.
  • Corrispondenza tra i tipi di dati: Se una clausola WHERE confronta una colonna VARCHAR con un numero, l'indice non puรฒ essere utilizzato a causa di un cast implicito.

DOMANDE FREQUENTI

Una chiave primaria identifica in modo univoco ogni riga ed รจ sempre indicizzata. Un indice generico velocizza le ricerche ma consente valori duplicati. Ogni chiave primaria รจ un indice, ma non ogni indice รจ una chiave primaria.

Evitate di creare indici su tabelle molto piccole, su colonne con pochissimi valori distinti (bassa cardinalitร ) e su tabelle in cui le operazioni di scrittura sono molto piรน frequenti di quelle di lettura. Ogni indice aggiuntivo rallenta ogni operazione di INSERT, UPDATE e DELETE.

Un indice composito (a piรน colonne) copre piรน di una colonna in un singolo indice. Rispetta la regola del prefisso piรน a sinistra, quindi puรฒ gestire query che filtrano sulla prima colonna, sulle prime due colonne e cosรฌ via, ma non sulla sola seconda colonna.

Correre EXPLAIN davanti all'istruzione SELECT. Il chiave la colonna mostra quale indice ha scelto l'ottimizzatore, mentre Digitare and righe ti diranno se il percorso di accesso รจ efficiente.

Un indice di copertura contiene tutte le colonne necessarie alla query, quindi il motore risponde alla query utilizzando solo l'indice, senza leggere la tabella. EXPLAIN visualizza "Utilizzo dell'indice" quando ciรฒ accade.

Le ragioni comuni includono l'avvolgimentoping la colonna in una funzione (WHERE YEAR(col) = โ€ฆ), conversioni di tipo implicite, cardinalitร  molto bassa e statistiche obsolete. Esegui ANALYZE TABLE per aggiornare le statistiche e ispezionare EXPLAIN per il vero motivo.

Gli assistenti basati sull'IA analizzano i log delle query lente, classificano i modelli piรน onerosi, suggeriscono indici a colonna singola o compositi e spiegano i piani di esecuzione di EXPLAIN in un linguaggio semplice. Riducono i tempi di ottimizzazione da ore a minuti per i carichi di lavoro di routine.

Sรฌ. Gli strumenti di intelligenza artificiale trasformano una richiesta come "velocizzare le ricerche dei clienti per email e data di registrazione" in un'istruzione CREATE INDEX funzionante, consigliano l'ordine delle colonne e spiegano l'impatto previsto sulla velocitร  di lettura e scrittura.

Riassumi questo post con: