sql >> Databáze >  >> RDS >> Mysql

Proč je LEFT JOIN pomalejší než INNER JOIN?

S INNER JOIN bude MySQL obecně začínat tabulkou s nejmenším počtem řádků. V tomto případě začíná tabulkou finished a vyhledá odpovídající záznam v saved pomocí indexu na saved.email .

Pro LEFT JOIN (s výjimkou některých optimalizací) MySQL obecně spojuje záznamy v pořadí (počínaje tabulkou zcela vlevo). V tomto případě MySQL začíná tabulkou saved , pak se pokusí najít každý odpovídající záznam v finished . Protože neexistuje žádný použitelný index na finished.email , musí provést úplnou kontrolu pro každé vyhledání.

Upravit

Nyní, když jste zveřejnili své schéma, vidím, že MySQL ignoruje index (finished.email ) při přechodu z utf8 na latin1 sada znaků. Nezveřejnili jste znakové sady a řazení pro každý sloupec, takže použiji výchozí znakovou sadu pro tabulku. Aby MySQL mohl index používat, musí být kolace kompatibilní.

MySQL může vynutit (upgradovat) latin1 řazení, které je velmi omezené, až do utf8 řazení, například unicode_ci (takže první dotaz může použít index na saved.email upgradem latin1 řazení do utf8 ), ale opak není pravdou (druhý dotaz nemůže použít index na finished.email protože nemůže downgradovat utf8 řazení dolů na latin1 ).

Řešením je změnit oba sloupce e-mailu na kompatibilní řazení, snad nejsnáze tím, že z nich uděláte identické znakové sady a řazení.



  1. Jedinečné omezení, jak se vyhnout duplicitám

  2. ASP.NET MVC 4, více modelů v jednom pohledu?

  3. nainstalujte mysql i mysqlnd na ubuntu 12.04

  4. Odstranění výchozího trasování – část 2