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

Ottimizzazione delle query basate su indici cluster e non cluster in SQL?

Non conosco gli interni di Microsoft SQL Server, ma posso rispondere per MySQL, che hai taggato per la tua domanda. I dettagli potrebbero variare per altre implementazioni.

1° trimestre. Esatto, non è necessario spazio aggiuntivo per l'indice cluster.

Cosa succede se si elimina l'indice cluster? Il motore InnoDB di MySQL utilizza sempre la chiave primaria (o la prima chiave univoca non nulla) come indice cluster. Se si definisce una tabella senza una chiave primaria o si elimina la chiave primaria di una tabella esistente, InnoDB genera una chiave artificiale interna per l'indice cluster . Questa chiave interna non ha una colonna logica a cui fare riferimento.

2° trimestre. Un ordine di righe restituito da una query che utilizza un indice non cluster non è garantito. In pratica, è l'ordine di accesso alle righe. Se hai bisogno che le righe vengano restituite in un ordine specifico, dovresti utilizzare ORDER BY nella tua domanda. Se l'ottimizzatore può dedurre che l'ordine desiderato è lo stesso dell'ordine in cui accederà alle righe (ordine dell'indice, per indice cluster o non cluster), può saltare il passaggio di ordinamento.

T3. L'indice non cluster di InnoDB non ha un puntatore alla riga corrispondente in una foglia dell'indice, ha il valore della chiave primaria. Quindi una ricerca in un indice non cluster è in realtà due ricerche B-tree, la prima per trovare la foglia dell'indice non cluster e quindi una seconda ricerca nell'indice cluster.

Questo è il doppio del costo di una singola ricerca B-tree (più o meno), quindi InnoDB ha una funzionalità extra chiamata Indice hash adattivo . I valori ricercati di frequente vengono memorizzati nella cache nell'AHI e la prossima volta che una query cerca un valore memorizzato nella cache, può eseguire una ricerca O(1). Nella cache AHI, trova un puntatore direttamente alla foglia dell'indice cluster, quindi elimina entrambi Ricerche B-tree, una parte del tempo.

Quanto questo migliora le prestazioni totali dipende dalla frequenza con cui si cercano gli stessi valori che sono stati cercati in precedenza. Secondo la mia esperienza, è tipico che il rapporto tra ricerche hash e ricerche non hash sia di circa 1:2.

Q4. Costruisci gli indici per servire le query che devi ottimizzare. In genere un indice cluster è una chiave primaria o univoca e, almeno nel caso di InnoDB, questa è richiesta. Né agesalary è probabile che sia unico.

Potrebbe piacerti la mia presentazione, Come progettare gli indici, davvero .

Q5. InnoDB crea automaticamente un indice quando dichiari un vincolo univoco. Non puoi avere il vincolo senza un indice esistente per esso. Se non avessi un indice, come farebbe il motore a garantire l'unicità quando inserisci un valore? Dovrebbe cercare nell'intera tabella un valore duplicato in quella colonna. L'indice aiuta a rendere i controlli univoci molto più efficienti.