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

Hvorfor er LEFT JOIN langsommere end INNER JOIN?

Med INNER JOIN vil MySQL generelt starte med tabellen med det mindste antal rækker. I dette tilfælde starter den med tabel finished og slår op efter den tilsvarende post i saved ved at bruge indekset på saved.email .

For en LEFT JOIN (med undtagelse af nogle optimeringer) forbinder MySQL generelt posterne i rækkefølge (begyndende med tabellen længst til venstre). I dette tilfælde starter MySQL med tabellen saved , og forsøger derefter at finde hver tilsvarende post i finished . Da der ikke er nogen brugelig indeks på finished.email , skal den lave en fuld scanning for hvert opslag.

Rediger

Nu hvor du har sendt dit skema, kan jeg se, at MySQL ignorerer indekset (finished.email ) når du går fra utf8 til latin1 tegnsæt. Du har ikke indsendt tegnsættene og kollationerne for hver kolonne, så jeg går efter standardtegnsættet for tabellen. Samlingerne skal være kompatible, for at MySQL kan bruge indekset.

MySQL kan tvinge (opgradere) en latin1 kollation, som er meget begrænset, op til en utf8 sortering såsom unicode_ci (så den første forespørgsel kan bruge indekset på saved.email ved at opgradere latin1 sortering til utf8 ), men det modsatte er ikke sandt (den anden forespørgsel kan ikke bruge indekset på finished.email da den ikke kan nedgradere en utf8 sortering ned til latin1 ).

Løsningen er at ændre begge e-mail-kolonner til en kompatibel sortering, måske nemmest ved at gøre dem til identiske tegnsæt og sorteringer.



  1. Flere forespørgsler VS Stored Procedure

  2. PHP MySQL lille forespørgsel timeout, skal indstille grænsen til 10

  3. Hvordan slår man MySQL strict mode til/fra i localhost (xampp)?

  4. Datatype for SUM-resultat i MySQL