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

Hvorfor er denne INNER JOIN/ORDER BY mysql-forespørgsel så langsom?

(Jeg antager, at du ville skrive ids.customer_id = customer.customer_id og ikke customer_ids.customer_id)

Uden ORDER BY greb mysql de første 10 id'er af type 10 (indekseret), slog kunden op for dem, og var færdig. (Bemærk, at LEFT JOIN her virkelig er en INNER JOIN, fordi joinbetingelserne kun gælder for rækker, der har en match i begge tabeller)

Med ORDER BY henter mysql sandsynligvis alle type=10 kunder sorterer dem derefter efter fornavn for at finde de første 10.

Du kan fremskynde dette ved enten at denormalisere kundetabellen (kopier typen til kundeposten) eller oprette en tilknytningstabel til at indeholde customer_id, name, type tupler. I begge tilfælde skal du tilføje et indeks på (type, name) . Hvis du bruger kortlægningstabellen, skal du bruge den til at lave en 3-vejs joinforbindelse med kunder og id'er.

Hvis type=10 er rimeligt almindelig, kan du også tvinge forespørgslen til at gå i kundetabellen efter navn og kontrollere typen for hver med STRAIGHT JOIN. Det vil ikke være så hurtigt som et sammensat indeks, men det vil være hurtigere end at trække alle kampe op.

Og som foreslået ovenfor, kør en EXPLAIN på din forespørgsel for at se den forespørgselsplan, som mysql bruger.



  1. Sådan ændres en datatype CLOB TIL VARCHAR2(sql)

  2. Laravel veltalende opdaterer ikke JSON-kolonne:Konvertering af matrix til streng

  3. Bliver databasesuperbruger - Engineyard

  4. Hvordan opretter man PHP to kolonne tabel med værdier fra databasen?