sql >> Databasteknik >  >> RDS >> Mysql

Varför är LEFT JOIN långsammare än INNER JOIN?

Med INNER JOIN kommer MySQL i allmänhet att börja med tabellen med det minsta antalet rader. I det här fallet börjar den med tabellen finished och söker efter motsvarande post i saved med hjälp av indexet på saved.email .

För en LEFT JOIN, (exklusive vissa optimeringar) ansluter MySQL i allmänhet posterna i ordning (börjar med tabellen längst till vänster). I det här fallet börjar MySQL med tabellen saved , och försöker sedan hitta varje motsvarande post i finished . Eftersom det inte finns någon användbar index på finished.email måste den göra en fullständig genomsökning för varje uppslagning.

Redigera

Nu när du har lagt upp ditt schema kan jag se att MySQL ignorerar indexet (finished.email ) när du går från utf8 till latin1 teckenuppsättning. Du har inte lagt upp teckenuppsättningar och sammanställningar för varje kolumn, så jag använder standardteckenuppsättningen för tabellen. Kollationerna måste vara kompatibla för att MySQL ska kunna använda indexet.

MySQL kan tvinga fram (uppgradera) en latin1 sammanställning, som är mycket begränsad, upp till en utf8 sortering som unicode_ci (så att den första frågan kan använda indexet på saved.email genom att uppgradera latin1 sortering till utf8 ), men motsatsen är inte sant (den andra frågan kan inte använda indexet på finished.email eftersom den inte kan nedgradera en utf8 sortering ner till latin1 ).

Lösningen är att ändra båda e-postkolumnerna till en kompatibel sortering, kanske enklast genom att göra dem till identiska teckenuppsättningar och sorteringar.



  1. SQL Server 2016:Skapa en lagrad procedur

  2. SQL Server ORDER BY datum och nollvärden sist

  3. Fråga om MYSQL PÅ DUBLIKATNYCKELUPPDATERING

  4. Kan MySql 5.0 ha en vy av en tabell som ligger på en annan server