sql >> Database >  >> RDS >> Mysql

Advies nodig voor het correct indexeren van een tabel met veel velden om op te zoeken

Ik heb een tabel aan het werk met hetzelfde soort dingen, veel kolommen en 1000 verschillende manieren om te selecteren. Het is een nachtmerrie. Ik ontdekte echter dat er bepaalde combinaties van filters zijn die vaak worden gebruikt. Het zijn die waarvoor ik indexen zou maken en de anderen zou verlaten die zelden worden gebruikt om langzaam te werken. In MSSQL kan ik een query uitvoeren om me de duurste query's te laten zien die tegen de database zijn uitgevoerd, mySQL zou iets soortgelijks moeten hebben. Zodra ik ze heb, maak ik een index die de kolommen bedekt om ze te versnellen. Uiteindelijk heb je het voor 90 procent gedekt. Persoonlijk zou ik nooit meer zo'n tafel ontwerpen, tenzij ik een AK47 op me had gericht. (mijn indexen zijn 3 keer groter dan de gegevens in de tabel, wat erg oncool is als je een bos of records moet toevoegen). Ik weet echter niet zeker hoe ik de tabel opnieuw zou ontwerpen, mijn eerste gedachte zou zijn om de tabel in tweeën te splitsen , maar dat zou elders hoofdpijn veroorzaken.

Gebruikerstabel (Gebruikers-ID, Naam)

1, Lisa
2, Jane
3, John

Gebruikersattributentabel (gebruikers-ID, attribuutnaam, attribuutwaarde)

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

Dit zou het identificeren van kenmerken sneller maken, maar uw zoekopdrachten zijn niet zo eenvoudig om te schrijven.

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

Dit zou het volgende moeten opleveren

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

Het enige dat u dan hoeft te doen, is een HAVING COUNT(*) =2 toevoegen aan de zoekopdracht om alleen de ID's te selecteren die overeenkomen. Het is een beetje ingewikkelder om uit te kiezen, maar het geeft ook een leuke functie, stel dat je filtert op 10 attributen, en retourneert al die attributen die 10 overeenkomsten hebben. Cool, maar zeg dat er geen 100% overeenkwam. Je zou kunnen zeggen he, ik vond er geen die overeenkwam, maar deze hadden 9 op 10 of een overeenkomst van 90%. (Zorg er wel voor dat als ik zoek naar een blonde vrouw met blauwe ogen, ik geen bericht krijg dat er geen is gevonden, maar hier zijn de volgende dichtstbijzijnde overeenkomende met blauwe ogen blonde kerels met een overeenkomende score van 60%. Dat zou heel oncool zijn)

Er zijn meer dingen waar u rekening mee moet houden als u ervoor kiest om de tabel te splitsen, zoals hoe u attributen opslaat als getallen, datums en tekst in een enkele kolom? Of zijn dit aparte tabellen, of kolommen. Geen eenvoudig antwoord in beide richtingen brede tafel of gesplitste tafels.



  1. Perl DBI-foutbericht:kan methode selectcol_arrayref niet aanroepen op een niet-gedefinieerde waarde

  2. Waarom zou ik mysql_*-functies niet gebruiken in PHP?

  3. Omzeil de JOIN-limiet van 61 tabellen in MySQL door subquery's in elkaar te nesten

  4. MySQL-volgorde op relevantie