Come cercare in modo efficiente le stringhe nella clausola WHERE di SQL

In questo articolo, spiegheremo come cercare stringhe in modo efficiente utilizzando la clausola WHERE di SQL. Illustreremo tecniche per migliorare la velocità di ricerca nei database di grandi dimensioni, includendo l’uso appropriato degli indici, l’ottimizzazione dell’operatore LIKE, l’uso della ricerca full-text, l’implementazione della ricerca con espressioni regolari e la verifica del piano di esecuzione delle query.

Indice

Uso degli indici

Gli indici sono strumenti fondamentali per migliorare significativamente la velocità di ricerca nei database. In particolare, nei tabelle di grandi dimensioni, l’uso appropriato degli indici può migliorare drasticamente l’efficienza delle ricerche.

Creazione di indici

Per creare un indice, è possibile utilizzare la seguente sintassi SQL. Di seguito è riportato un esempio di creazione di un indice sulla colonna name.

CREATE INDEX idx_name ON users(name);

Questo indice accelera la ricerca sulla colonna name.

Tipi di indici

Nei database SQL, esistono principalmente due tipi di indici.

Indice su singola colonna

È un indice creato su una singola colonna. È utile per cercare valori specifici in una determinata colonna.

Indice composito

È un indice creato combinando più colonne. È efficiente quando si eseguono ricerche con più condizioni.

CREATE INDEX idx_name_age ON users(name, age);

L’indice composito ottimizza le ricerche basate su più colonne.

Considerazioni sull’uso degli indici

Nonostante siano utili, gli indici presentano anche alcune considerazioni da tenere a mente.

Impatto sulle prestazioni di scrittura

Gli indici possono influenzare le prestazioni di operazioni di inserimento, aggiornamento e cancellazione, poiché richiedono elaborazione aggiuntiva durante queste operazioni.

Rimozione degli indici non necessari

Gli indici non utilizzati possono influenzare negativamente le prestazioni del database. Si consiglia di controllare regolarmente l’utilizzo degli indici e di eliminare quelli non necessari.

DROP INDEX idx_name;

L’uso appropriato degli indici può migliorare significativamente le prestazioni delle query SQL. Successivamente, spiegheremo l’ottimizzazione dell’operatore LIKE.

Ottimizzazione dell’operatore LIKE

L’operatore LIKE di SQL viene utilizzato per ricerche di corrispondenza parziale. Tuttavia, poiché può influenzare le prestazioni, è importante conoscerne l’uso efficiente.

Ricerca LIKE di base

Una ricerca LIKE di base viene eseguita come segue.

SELECT * FROM users WHERE name LIKE 'John%';

Questa query cerca tutti i record nella colonna name che iniziano con “John”.

Uso dei caratteri jolly

Nell’operatore LIKE possono essere utilizzati vari caratteri jolly.

Carattere jolly %

Corrisponde a qualsiasi sequenza di caratteri. Ad esempio, LIKE '%John%' corrisponde a qualsiasi stringa che contiene “John” in qualsiasi posizione.

Carattere jolly _

Corrisponde a un singolo carattere. Ad esempio, LIKE 'J_n' corrisponde a qualsiasi stringa di tre lettere che inizia con “J” e termina con “n”.

Combinazione con gli indici

Per sfruttare gli indici nelle ricerche con l’operatore LIKE, è necessario fare attenzione alla posizione dei caratteri jolly.

Corrispondenza all’inizio

Quando il carattere jolly è alla fine (ad esempio, LIKE 'John%'), l’indice può essere utilizzato.

CREATE INDEX idx_name ON users(name);
SELECT * FROM users WHERE name LIKE 'John%';

In questo caso, l’indice viene utilizzato, accelerando la ricerca.

Carattere jolly all’inizio

Quando il carattere jolly è all’inizio (ad esempio, LIKE '%John'), l’indice non può essere utilizzato. In questo caso, viene eseguita una scansione completa della tabella, con conseguente riduzione delle prestazioni.

SELECT * FROM users WHERE name LIKE '%John';

Questa query non utilizza l’indice, richiedendo il controllo di tutti i record.

Uso delle sequenze di escape

Per trattare i caratteri jolly come stringhe nell’operatore LIKE, si utilizzano sequenze di escape.

SELECT * FROM users WHERE name LIKE '100\%' ESCAPE '\';

Questa query cerca la stringa “100%” nel database.

Uso delle funzioni di manipolazione delle stringhe

Invece dell’operatore LIKE, si possono considerare altre funzioni di manipolazione delle stringhe come SUBSTRING, LEFT o RIGHT.

SELECT * FROM users WHERE LEFT(name, 4) = 'John';

In questo modo, è possibile effettuare una ricerca che corrisponda all’inizio della stringa.

Ottimizzare l’operatore LIKE può migliorare le prestazioni della ricerca di stringhe. Successivamente, discuteremo l’uso della ricerca full-text.

Uso della ricerca full-text

La ricerca full-text è uno strumento potente per cercare rapidamente grandi quantità di dati testuali. È particolarmente utile nei casi in cui la ricerca parziale con l’operatore LIKE comporta un calo delle prestazioni.

Creazione di un indice full-text

Per utilizzare la ricerca full-text, è necessario prima creare un indice full-text. La seguente query SQL crea un indice full-text sulla colonna content.

CREATE FULLTEXT INDEX idx_content ON articles(content);

Questo indice consente la ricerca full-text sulla colonna content.

Esecuzione di una ricerca full-text

Per eseguire una ricerca full-text, si utilizzano le clausole MATCH e AGAINST. L’esempio seguente cerca la parola “database” all’interno della colonna content.

SELECT * FROM articles 
WHERE MATCH(content) AGAINST('database');

Questa query cerca rapidamente i record che contengono la parola “database” nella colonna content.

Ricerca in linguaggio naturale e modalità booleana

La ricerca full-text offre due modalità principali: la ricerca in linguaggio naturale e la modalità booleana.

Ricerca in linguaggio naturale

Nella ricerca in linguaggio naturale, i risultati vengono restituiti in base alla rilevanza delle parole. Ad esempio, la seguente query esegue una ricerca in linguaggio naturale.

SELECT * FROM articles 
WHERE MATCH(content) AGAINST('efficient SQL search' IN NATURAL LANGUAGE MODE);

Ricerca in modalità booleana

Nella ricerca in modalità booleana, è possibile utilizzare operatori logici come AND, OR, NOT per specificare condizioni di ricerca più dettagliate.

SELECT * FROM articles 
WHERE MATCH(content) AGAINST('+efficient +SQL -slow' IN BOOLEAN MODE);

Questa query cerca record che contengono “efficient” e “SQL”, ma non “slow”.

Manutenzione degli indici

Gli indici full-text richiedono una manutenzione regolare, poiché vengono aggiornati frequentemente a seguito di aggiunte, aggiornamenti o cancellazioni di dati. La ricostruzione degli indici aiuta a mantenere le prestazioni di ricerca.

ALTER TABLE articles 
DROP INDEX idx_content,
ADD FULLTEXT INDEX idx_content(content);

Limitazioni della ricerca full-text

La ricerca full-text presenta alcune limitazioni. Ad esempio, parole brevi o molto comuni potrebbero essere ignorate, e alcuni database potrebbero non supportare la ricerca full-text.

L’uso della ricerca full-text consente di cercare efficacemente grandi quantità di dati testuali. Successivamente, discuteremo l’implementazione della ricerca con espressioni regolari.

Implementazione della ricerca con espressioni regolari

Le espressioni regolari (Regular Expression) sono strumenti potenti per cercare modelli complessi di stringhe in modo flessibile. Anche in SQL, è possibile utilizzare espressioni regolari per eseguire ricerche più avanzate.

Nozioni di base sulla ricerca con espressioni regolari

Alcuni database SQL supportano la ricerca con espressioni regolari. In MySQL, è possibile eseguire una ricerca con espressioni regolari utilizzando l’operatore REGEXP.

SELECT * FROM users 
WHERE name REGEXP '^[A-Za-z]+$';

Questa query cerca record nella colonna name che contengono solo lettere dell’alfabeto.

Sintassi di base delle espressioni regolari

È importante comprendere la sintassi di base delle espressioni regolari. Ecco alcuni esempi.

Classi di caratteri

Definiscono un insieme specifico di caratteri. Ad esempio, [A-Za-z] rappresenta lettere maiuscole e minuscole.

Ancore

Specifica l’inizio o la fine di una stringa. ^ indica l’inizio, mentre $ indica la fine della stringa.

Quantificatori

Specifica il numero di occorrenze di un modello specifico. Ad esempio, {2,4} indica che il modello deve apparire da 2 a 4 volte.

Uso avanzato delle espressioni regolari

Con le espressioni regolari, è possibile cercare modelli complessi. Ad esempio, per cercare un formato di indirizzo email, si utilizza la seguente query.

SELECT * FROM users 
WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';

Questa query cerca record che corrispondono al formato generale di un indirizzo email.

Prestazioni delle espressioni regolari

Le ricerche con espressioni regolari sono molto potenti, ma è necessario prestare attenzione alle prestazioni. In particolare, in dataset di grandi dimensioni, le ricerche con espressioni regolari possono essere lente. Quando possibile, è consigliabile utilizzare anche indici o considerare metodi di ricerca alternativi.

Esempi di implementazione della ricerca con espressioni regolari

Di seguito sono riportati alcuni esempi di implementazione delle espressioni regolari.

Ricerca di numeri di telefono

SELECT * FROM contacts 
WHERE phone REGEXP '^\(\d{3}\) \d{3}-\d{4}$';

Questa query cerca record che corrispondono al formato dei numeri di telefono statunitensi (es.: (123) 456-7890).

Ricerca di codici postali

SELECT * FROM addresses 
WHERE postal_code REGEXP '^\d{5}(-\d{4})?$';

Questa query cerca record che corrispondono ai codici postali statunitensi a 5 o 9 cifre.

Con l’uso delle espressioni regolari, è possibile effettuare ricerche di stringhe con modelli complessi. Successivamente, discuteremo la verifica del piano di esecuzione delle query.

Verifica del piano di esecuzione delle query

Verificare il piano di esecuzione delle query è un passaggio fondamentale per ottimizzare le prestazioni delle query SQL. Analizzando il piano di esecuzione, è possibile comprendere come il database esegue una query e identificare eventuali colli di bottiglia.

Cos’è un piano di esecuzione delle query

Il piano di esecuzione delle query mostra il piano interno del database per eseguire una query. Questo piano include dettagli come la scansione delle tabelle, l’uso degli indici e i metodi di join.

Uso del comando EXPLAIN

Molti database SQL consentono di visualizzare il piano di esecuzione delle query utilizzando il comando EXPLAIN. Nell’esempio seguente, esaminiamo il piano di una query che cerca un nome specifico nella tabella users.

EXPLAIN SELECT * FROM users WHERE name = 'John';

Il risultato di questo comando mostra il piano di esecuzione della query, indicando quali indici sono stati utilizzati, se è stata eseguita una scansione della tabella e altre informazioni utili.

Come leggere un piano di esecuzione delle query

È importante comprendere i vari elementi di un piano di esecuzione delle query. Ecco alcune spiegazioni degli elementi comuni.

Tabella

Indica il nome della tabella utilizzata nella query.

Tipo

Indica il metodo di esecuzione. ALL indica una scansione completa della tabella, index indica una scansione dell’indice, mentre const o eq_ref indicano metodi di accesso più efficienti.

Chiavi possibili

Elenca gli indici disponibili per la query.

Chiave

Indica l’indice effettivamente utilizzato.

Lunghezza della chiave

Indica la lunghezza della chiave di indice utilizzata.

Numero di righe

Stima il numero di righe esaminate durante l’esecuzione della query.

Informazioni aggiuntive

Fornisce dettagli aggiuntivi sull’esecuzione della query.

Ottimizzazione del piano di esecuzione delle query

Analizzando il piano di esecuzione, è possibile ottimizzare le prestazioni delle query SQL con i seguenti metodi.

Aggiunta di indici

Aggiungendo indici in modo appropriato, è possibile migliorare le prestazioni di ricerca.

CREATE INDEX idx_name ON users(name);

Ottimizzazione del metodo di join

Rivedere il metodo di join e adottare una strategia di join efficiente. Ad esempio, usare in modo appropriato INNER JOIN o LEFT JOIN.

EXPLAIN SELECT * FROM users 
INNER JOIN orders ON users.id = orders.user_id 
WHERE users.name = 'John';

Ristrutturazione della query

Ristrutturare la query per ridurre l’accesso inutile ai dati. Ad esempio, utilizzare un join invece di una sottoquery.

SELECT users.name, orders.order_date 
FROM users 
JOIN orders ON users.id = orders.user_id 
WHERE users.name = 'John';

Uso degli strumenti

Molti strumenti di gestione dei database e IDE includono funzionalità per analizzare i piani di esecuzione delle query. Utilizzando questi strumenti, è possibile analizzare e ottimizzare facilmente le prestazioni delle query.

Verificando regolarmente i piani di esecuzione delle query, è possibile mantenere le prestazioni delle query SQL e gestire il database in modo efficiente. Infine, riepiloghiamo quanto discusso finora.

Conclusione

Per cercare stringhe in modo efficiente nella clausola WHERE di SQL, è importante combinare varie tecniche. Utilizzando correttamente gli indici, ottimizzando l’operatore LIKE, sfruttando la ricerca full-text, implementando la ricerca con espressioni regolari e verificando e ottimizzando il piano di esecuzione delle query, è possibile mantenere elevate le prestazioni di ricerca anche nei database di grandi dimensioni. Utilizzate questi metodi per massimizzare le prestazioni del vostro database.

Indice