Domanda

Supponiamo che io ho due query su una tabella del database.

Le query sono definiti in termini di campi utilizzati nella query:

Query1: dipende da f1, f2, f3 e

Query2: dipende da f1, f2, f3 e f4

Ricordo di aver letto da qualche parte che il motore di query SQL (MySQL in questo caso) analizza l'albero dell'indice a partire dai campi più a sinistra dell'indice.

Se questo è corretto, allora suppongo che invece di avere due indici definiti nella tabella in questo modo:

Index 1 (for Query1) : CREATE INDEX idx_1 {f1, f2, f3}
Index 2 (for Query2) : CREATE INDEX idx_2 {f1, f2, f3, f4}

Posso semplicemente definire un indice che contiene l'unione delle chiavi utilizzate in entrambe le query -. Cioè

Ho solo bisogno di definire questo indice:

(for BOTH Query1) : CREATE INDEX the_idx {f1, f2, f3, f4}

Ho due domande:

  1. La mia ipotesi corretta ?. cioè posso semplicemente definire un indice (the_idx) invece dei due precedenti?

  2. Fa questo indice comportamento valere per motore di query PostgreSQL come bene?

È stato utile?

Soluzione

  

La mia ipotesi corretta ?. cioè posso semplicemente definire un indice (the_idx) invece dei due precedenti?

Sì.
Si chiama un indice di copertura, e si desidera ordinare le colonne in base alle quali è più probabile che sia query utilizzate. IE: se f2 è la colonna più comune, che ci si vuole utilizzare:

CREATE INDEX the_idx {f2, f1, f3, f4}
  

Fa questo indice comportamento valere per motore di query PostgreSQL come bene?

No, Postgres non supporta copre indici .

Gli indici non sono standard ANSI; è un miracolo la terminologia è così coerente tra fornitori così com'è.

Altri suggerimenti

, in generale, l'indice più popolata sarà utilizzabile. tuttavia più si aggiunge a tale indice, più luminosa sarà necessaria.

la cosa migliore sarebbe quella di provare, e sguardo al piano di esecuzione per vedere se utilizzato nel modo che ci si aspetta.

seconda delle colonne effettive restituite nel set di risultati, può essere più vantaggioso utilizzare un indice più breve.

Il MySQL manuale rende ragionevolmente chiaro che sì, qualsiasi "prefisso" di una chiave può essere ricercato in ogni indice non hash (che è la maggior parte di loro).

Non è stato possibile trovare la documentazione comparabile per PostgreSQL, ma si può sempre creare la tabella e poi fare un spiegare (non è una cattiva idea in ogni caso).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top