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

Der er brug for råd til korrekt indeksering af en tabel med mange felter, der skal søges på

Jeg har et bord på arbejde med den samme slags ting, masser af kolonner og 1000 forskellige måder at vælge på. Det er et mareridt. Jeg fandt dog, at der er visse kombinationer af filtre, der bruges ofte. Det er dem, jeg ville lave indekser for og lade de andre være, som sjældent bruges til at køre langsomt. I MSSQL kan jeg køre en forespørgsel for at vise mig de dyreste forespørgsler, der er blevet kørt mod databasen, mySQL burde have en lignende ting. Når jeg har dem, opretter jeg et indeks, der dækker kolonnerne for at fremskynde dem. Til sidst vil du have det 90 procent dækket. Jeg personligt ville aldrig designe sådan et bord igen, medmindre jeg havde en AK47 peget på mig. (mine indekser er 3 gange større end dataene i tabellen, hvilket er meget ulækkert, hvis du skal tilføje en masse eller poster). Jeg er dog ikke sikker på, hvordan jeg ville redesigne tabellen. Min første tanke ville være at opdele tabellen i to , men det ville øge hovedpine andre steder.

Brugertabel (bruger-id, navn)

1, Lisa
2, Jane
3, John

Brugerattributtabel(BrugerID, AttributName,AttributValue)

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

Dette ville gøre identifikation af attributter hurtigere, men gøre dine forespørgsler ikke så ligetil at skrive.

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

Dette skulle returnere følgende

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

Alt du skal gøre derefter er at tilføje et HAVING COUNT(*) =2 til forespørgslen for kun at vælge de ID'er, der matcher. Det er lidt mere involveret at vælge imellem, men det giver også en pæn funktion, sige, at du filtrerer på 10 attributter og returnerer alle dem, der har 10 matchende. Fedt, men siger ingen matchede 100%. Du kan sige hej, jeg fandt ingen, der matchede, men disse havde 9 ud af 10 eller 90 % match. (bare sørg for, at hvis jeg søger efter en blåøjet blond kvinde, får jeg ikke en besked, der siger, at ingen blev fundet, men her er de næstnærmeste matchende, der indeholder blåøjede blonde fyre med en matchende score på 60%. Det ville være meget ucool)

Der er flere ting, der skal overvejes, hvis du vælger at opdele tabellen, såsom hvordan gemmer du attributter som tal, datoer og tekst i en enkelt kolonne? Eller er disse separate tabeller eller kolonner. Intet nemt svar, hverken brede bord eller opdelte borde.



  1. Sådan installeres SQL Server på en M1 Mac (ARM64)

  2. Er hexing-input tilstrækkeligt til at rense SQL-forespørgsler?

  3. Håndterer mysqldump binære data pålideligt?

  4. PL/SQL-sammenligningsfejl i trigger (PLS-00405)