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

Consigli necessari per indicizzare correttamente una tabella con molti campi su cui effettuare la ricerca

Ho una tabella al lavoro con lo stesso tipo di cose, molte colonne e 1000 modi diversi per selezionare. È un incubo. Tuttavia, ho scoperto che ci sono alcune combinazioni di filtri che vengono utilizzati spesso. Sono quelli per cui creerei indici e lascerei gli altri che raramente vengono utilizzati per funzionare lentamente. In MSSQL, posso eseguire una query per mostrarmi le query più costose che sono state eseguite sul database, MySQL dovrebbe avere una cosa simile. Una volta che li ho, creo un indice che copre le colonne per velocizzarle. Alla fine, lo avrai coperto al 90 percento. Personalmente non progetterei mai più un tavolo del genere a meno che non avessi un AK47 puntato contro di me. (i miei indici sono 3 volte più grandi dei dati nella tabella, il che non è interessante se è necessario aggiungere un gruppo o record). Tuttavia, non sono sicuro di come riprogettare la tabella, il mio primo pensiero sarebbe quello di dividere la tabella in due , ma ciò aggiungerebbe mal di testa altrove.

Tabella utente (ID utente, nome)

1, Lisa
2, Jane
3, John

Tabella attributi utente (ID utente, nome attributo, valore attributo)

1, EYES, Brown
1, GENDER, Female
2, EYES, Blue
2, GENDER, Female
3  EYES, Blue
3, GENDER, Male

Ciò renderebbe più veloce l'identificazione degli attributi, ma renderebbe le tue query non così semplici da scrivere.

SELECT UserID, COUNT(*) as MatchingAttributes
FROM   UserAttributes 
WHERE  (UserAttributes.AttributeName = 'EYES' AND UserAttributes.AttributeValue = 'Blue') OR
       (UserAttributes.AttributeName = 'GENDER' AND UserAttributes.AttributeValue = 'Female') 

Questo dovrebbe restituire quanto segue

UserID, MatchingAttributes
1, 1
2, 2
3, 1

Tutto quello che devi fare è aggiungere un HAVING COUNT(*) =2 alla query per selezionare solo gli ID corrispondenti. È un po' più complicato scegliere, ma offre anche una caratteristica precisa, supponiamo di filtrare su 10 attributi e restituire tutti quelli che hanno 10 corrispondenze. Fantastico, ma dì che nessuno corrispondeva al 100%. Potresti dire ehi, non ho trovato nessuno che corrispondesse, ma questi avevano 9 su 10 o una corrispondenza del 90%. (assicurati solo che se cerco una donna bionda con gli occhi azzurri, non ricevo un messaggio che dice che non ne è stata trovata nessuna, ma qui ci sono le successive corrispondenze più vicine contenenti tipi biondi dagli occhi azzurri con un punteggio di corrispondenza del 60%. Ciò sarebbe essere molto scortese)

Ci sono altre cose che dovrebbero essere prese in considerazione se si sceglie di dividere la tabella, ad esempio come si archiviano attributi come numeri, date e testo in una singola colonna? O sono queste tabelle o colonne separate. Nessuna risposta facile in entrambi i casi tavolo ampio o tavoli divisi.