Domanda

Qualcuno sa quale sia la complessità per l'operatore SQL LIKE per i database più popolari?

È stato utile?

Soluzione

Consideriamo i tre casi principali separatamente. Questa discussione è specifica per MySQL, ma potrebbe applicarsi anche ad altri DBMS a causa del fatto che gli indici sono generalmente implementati in modo simile.

COME 'foo%' è veloce se eseguito su una colonna indicizzata. Gli indici MySQL sono una variante di alberi B, quindi quando si esegue questa query può semplicemente scendere l'albero al nodo corrispondente a foo , o al primo nodo con quel prefisso, e attraversa l'albero in avanti. Tutto questo è molto efficiente.

COME '% foo' non può essere accelerato dagli indici e comporterà una scansione completa della tabella. Se hai altri criteri che possono essere eseguiti utilizzando gli indici, scansionerà solo le righe che rimangono dopo il filtro iniziale.

C'è un trucco però : se è necessario eseguire la corrispondenza dei suffissi, ad esempio la ricerca di nomi di file con estensione .foo , è possibile ottenere le stesse prestazioni aggiungendo una colonna con lo stesso contenuto di quella originale ma con i caratteri in ordine inverso.

ALTER TABLE my_table ADD COLUMN col_reverse VARCHAR (256) NOT NULL;
ALTER TABLE my_table ADD INDEX idx_col_reverse (col_reverse);
UPDATE my_table SET col_reverse = REVERSE(col);

La ricerca di righe con col che termina con .foo diventa:

SELECT * FROM my_table WHERE col_reverse LIKE 'oof.%'

Infine, c'è COME '% foo%' , per il quale non ci sono scorciatoie. Se non ci sono altri criteri limitanti che riducono la quantità di righe a una fattibilità numero, causerà un duro colpo di prestazione. Potresti invece prendere in considerazione una soluzione di ricerca full-text o un'altra soluzione specializzata.

Altri suggerimenti

Se stai chiedendo l'impatto sulle prestazioni:

Il problema di like è che impedisce al database di usare un indice. Su Oracle penso che non usi più gli indici (ma sono ancora su Oracle 9). SqlServer utilizza gli indici se il carattere jolly è solo alla fine. Non conosco altri database.

Dipende dall'RDBMS, dai dati (e possibilmente dalla dimensione dei dati), dagli indici e da come viene usato il LIKE (con o senza jolly prefisso)!

Stai ponendo una domanda troppo generica.

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