sql >> Databasteknik >  >> RDS >> Mysql

Råd behövs för att korrekt indexera en tabell med många fält att söka på

Jag har ett bord på jobbet med samma sorts saker, många kolumner och 1000 olika sätt att välja på. Det är en mardröm. Jag fann dock att det finns vissa kombinationer av filter som används ofta. Det är de jag skulle skapa index för och lämna de andra som sällan används för att gå långsamt. I MSSQL kan jag köra en fråga för att visa mig de dyraste frågorna som har körts mot databasen, mySQL borde ha en liknande sak. När jag väl har dem skapar jag ett index som täcker kolumnerna för att snabba upp dem. Så småningom kommer du att ha det 90 procent täckt. Jag personligen skulle aldrig designa ett sådant bord igen om jag inte hade en AK47 riktad mot mig. (mina index är 3 gånger större än data i tabellen, vilket är väldigt otäckt om du behöver lägga till ett gäng eller poster). Jag är dock inte säker på hur jag skulle designa om tabellen. Min första tanke skulle vara att dela tabellen i två , men det skulle öka huvudvärken på andra håll.

Användartabell (Användar-ID, Namn)

1, Lisa
2, Jane
3, John

Användarattributtabell (Användar-ID, Attributnamn, AttributValue)

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

Detta skulle göra identifieringen av attribut snabbare, men göra dina frågor inte lika enkla att skriva.

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

Detta bör returnera följande

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

Allt du behöver göra då är att lägga till ett HAVING COUNT(*) =2 i frågan för att bara välja de ID:n som matchar. Det är lite mer involverat att välja mellan, men det ger också en snygg funktion, säg att du filtrerar på 10 attribut och returnerar alla de som har 10 matchande. Coolt, men säg att ingen matchade 100%. Man kan säga hej, jag hittade ingen som matchade, men dessa hade 9 av 10 eller 90 % matchning. (Se bara till, om jag söker efter en blåögd blond hona, får jag inte ett meddelande som säger att ingen hittades men här är de näst närmast matchande som innehåller blåögda blonda killar med en matchande poäng på 60%. Det skulle vara väldigt otäck)

Det finns fler saker som skulle behöva övervägas om du valde att dela tabellen, som hur lagrar du attribut som siffror, datum och text i en enda kolumn? Eller är dessa separata tabeller eller kolumner. Inget enkelt svar, vare sig breda bord eller delade bord.



  1. TAN() Funktion i Oracle

  2. Hur skapar man Codeigniter-språkfiler från databasen?

  3. Välj unik postgräns med N rader

  4. Oracle:Returnerar flera värden i en funktion