Mysql
 sql >> база данни >  >> RDS >> Mysql

Защо LEFT JOIN е по-бавен от INNER JOIN?

С INNER JOIN MySQL обикновено започва с таблицата с най-малък брой редове. В този случай тя започва с таблица finished и прави търсене на съответния запис в saved използвайки индекса на saved.email .

За LEFT JOIN (с изключение на някои оптимизации) MySQL обикновено обединява записите по ред (започвайки от най-лявата таблица). В този случай MySQL започва с таблицата saved , след което се опитва да намери всеки съответен запис в finished . Тъй като няма използваемен индекс на finished.email , той трябва да извърши пълно сканиране за всяко търсене.

Редактиране

Сега, когато публикувахте своята схема, виждам, че MySQL игнорира индекса (finished.email ) при преминаване от utf8 на latin1 набор от символи. Не сте публикували наборите от знаци и съпоставянията за всяка колона, така че ще използвам набора от символи по подразбиране за таблицата. Съпоставянията трябва да са съвместими, за да може MySQL да използва индекса.

MySQL може да принуди (надгражда) latin1 съпоставяне, което е много ограничено, до utf8 съпоставяне като unicode_ci (така че първата заявка може да използва индекса на saved.email чрез надграждане на latin1 съпоставяне към utf8 ), но обратното не е вярно (втората заявка не може да използва индекса на finished.email тъй като не може да понижи utf8 съпоставяне до latin1 ).

Решението е да промените и двете колони на имейла на съвместимо съпоставяне, може би най-лесно, като ги направите идентични набори от знаци и съпоставяния.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да използвам JOIN в израза UPDATE?

  2. Първият html ред не се показва

  3. Пресичане на заявка с активен запис

  4. Вмъкване на множество реда от php формуляр в базата данни

  5. Общ табличен израз в MySQL