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

Ottimizzazione della ricerca MySQL tramite like e caratteri jolly

Quanto sono lunghe le tue corde?

Se sono relativamente brevi (ad es. parole inglesi; avg_len=5) e hai spazio di archiviazione del database libero, prova questo approccio:

  • Per ogni parola che vuoi memorizzare nella tabella, prendi invece ogni possibile suffisso di quella parola. In altre parole, continui a rimuovere il primo carattere finché non rimane nulla. Ad esempio, la parola value dà:
    • value
    • value
    • lue
    • ue
    • e
  • Conserva ciascuno di questi suffissi nel database.
  • Ora puoi cercare sottostringhe usando LIKE 'alu%' (che troverà 'alu' come parte di 'valore').

Memorizzando tutti i suffissi, hai eliminato la necessità del carattere jolly principale (consentendo l'utilizzo di un indice per la ricerca rapida), a scapito dello spazio di archiviazione.

Costo di archiviazione

Il numero di caratteri necessari per memorizzare una parola diventa word_len*word_len / 2 , cioè quadratico nella lunghezza della parola, per parola. Ecco il fattore di aumento per le varie dimensioni delle parole:

  • Parola di 3 lettere:(3*3/2) / 3 = 1.5
  • Parola di 5 lettere:(5*5/2) / 5 = 2.5
  • Parola di 7 lettere:(7*7/2) / 7 = 3.5
  • Parola di 12 lettere:(12*12/2) / 12 = 6

Il numero di righe necessarie per memorizzare una parola aumenta da 1 a word_len . Sii consapevole di questo sovraccarico. Le colonne aggiuntive dovrebbero essere ridotte al minimo per evitare di archiviare grandi quantità di dati ridondanti. Ad esempio, un numero di pagina su cui è stata trovata originariamente la parola dovrebbe andare bene (pensare unsigned smallint), ma i metadati estesi sulla parola dovrebbero essere archiviati in una tabella separata per parola, piuttosto che per ogni suffisso.

Considerazioni

C'è un compromesso in cui dividiamo le "parole" (o frammenti). Come esempio del mondo reale:cosa facciamo con i trattini? Conserviamo l'aggettivo five-letter come una parola o due?

Il compromesso è il seguente:

  • Tutto ciò che è suddiviso non può essere trovato come un singolo elemento. Se memorizziamo five e letter separatamente, cercando five-letter o five-letter fallirà.
  • Tutto ciò che non rotto richiederà più spazio di archiviazione. Ricorda, il requisito di archiviazione aumenta quadraticamente nella lunghezza della parola.

Per comodità, potresti voler rimuovere il trattino e memorizzare five-letter . La parola ora può essere trovata cercando five , letter e five-letter . (Se rimuovi i trattini anche da qualsiasi query di ricerca, gli utenti possono comunque trovare correttamente five-letter .)

Infine, ci sono modi per archiviare array di suffissi che non comportano molto sovraccarico, ma non sono ancora sicuro che si traducano bene nei database.