sql >> Database >  >> RDS >> Mysql

Waarom is LEFT JOIN langzamer dan INNER JOIN?

Bij INNER JOIN begint MySQL over het algemeen met de tabel met het kleinste aantal rijen. In dit geval begint het met tabel finished en zoekt het corresponderende record op in saved met behulp van de index op saved.email .

Voor een LEFT JOIN (met uitzondering van enkele optimalisaties) voegt MySQL de records over het algemeen in volgorde samen (beginnend met de meest linkse tabel). In dit geval begint MySQL met de tabel saved en probeert vervolgens elk corresponderend record te vinden in finished . Aangezien er geen bruikbare . is index op finished.email , het moet voor elke zoekopdracht een volledige scan uitvoeren.

Bewerken

Nu je je schema hebt gepost, kan ik zien dat MySQL de index negeert (finished.email ) wanneer u van utf8 . gaat naar latin1 karakterset. Je hebt niet de karaktersets en sorteringen voor elke kolom gepost, dus ik ga voor de standaard karakterset voor de tabel. De sorteringen moeten compatibel zijn zodat MySQL de index kan gebruiken.

MySQL kan een latin1 . dwingen (upgraden) verzameling, die zeer beperkt is, tot een utf8 sortering zoals unicode_ci (zodat de eerste zoekopdracht de index kan gebruiken op saved.email door latin1 te upgraden sortering naar utf8 ), maar het tegenovergestelde is niet waar (de tweede zoekopdracht kan de index op finished.email niet gebruiken omdat het een utf8 . niet kan downgraden sortering tot latin1 ).

De oplossing is om beide e-mailkolommen te wijzigen in een compatibele sortering, misschien het gemakkelijkst door ze identieke tekensets en sorteringen te maken.



  1. Voer db-query (sql-server 2005) uit met ajax. Is dit mogelijk?

  2. mysql cte . gebruiken met en invoegen waarschuwt een syntaxisfout

  3. Unieke beperking, hoe duplicaten te voorkomen

  4. Base64-gecodeerde gegevens opslaan als BLOB- of TEXT-gegevenstype