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.
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.