sql >> Databasteknik >  >> RDS >> Mysql

Varför är denna INNER JOIN/ORDER BY mysql-fråga så långsam?

(Jag antar att du menade att skriva ids.customer_id = customer.customer_id och inte customer_ids.customer_id)

Utan ORDER BY mysql tog tag i de första 10 ID:n av typ 10 (indexerade), letade upp kunden för dem och var klar. (Observera att LEFT JOIN här verkligen är en INNER JOIN eftersom kopplingsvillkoren endast gäller för rader som har en matchning i båda tabellerna)

Med ORDER BY mysql hämtar förmodligen alla type=10 kunder sorterar dem sedan efter förnamn för att hitta de första 10.

Du kan påskynda detta genom att antingen avnormalisera kundtabellen (kopiera typen till kundposten) eller skapa en mappningstabell som innehåller customer_id, name, type tupler. I båda fallen, lägg till ett index på (type, name) . Om du använder mappningstabellen, använd den för att göra en trevägskoppling med kunder och ID.

Om typ=10 är någorlunda vanligt kan du också tvinga frågan att gå i kundtabellen efter namn och kontrollera typen för var och en med STRAIGHT JOIN. Det kommer inte att vara lika snabbt som ett sammansatt index, men det kommer att gå snabbare än att dra upp alla matcher.

Och som föreslagits ovan, kör en EXPLAIN på din fråga för att se frågeplanen som mysql använder.



  1. Skapa unika slumpmässiga alfanumeriska tecken som är 7 tecken långa

  2. Hur kan jag få en fråga för .save() i django?

  3. Hur man lägger till ledande nollor till ett nummer i MySQL

  4. Endast en aktiv för varje relationsbegränsning