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

Jak optimalizovat tento jednoduchý dotaz Mysql

OR podmínky, pokud nejsou ve stejném poli nebo rozsahu (jako například < , > , LIKE ) skutečně snížit schopnost MySQL využívat indexy; Dotazy můžete restrukturalizovat tak, že je rozdělíte na samostatné jednodušší, které pak můžete UNION. Oddělení tímto způsobem umožňuje MySQL využít výhody odlišného indexu každého dotazu v rámci UNION

SELECT `u`.`user_id`, `c`.`company`
FROM `users` AS `u` LEFT JOIN `companies` AS `c` ON `c`.`user_id` = `u`.`user_id`
WHERE `u`.`user_id` = 'search_term' 
UNION DISTINCT 
SELECT `u`.`user_id`, `c`.`company`
FROM `users` AS `u` LEFT JOIN `companies` AS `c` ON `c`.`user_id` = `u`.`user_id`
WHERE `u`.`lname` LIKE 'search_term%'    
UNION DISTINCT 
SELECT `u`.`user_id`, `c`.`company`
FROM `users` AS `u` LEFT JOIN `companies` AS `c` ON `c`.`user_id` = `u`.`user_id`
WHERE `u`.`email` LIKE 'search_term%'
UNION DISTINCT 
SELECT `u`.`user_id`, `c`.`company`
FROM `users` AS `u` INNER JOIN `companies` AS `c` ON `c`.`user_id` = `u`.`user_id`
WHERE `c`.`company` LIKE 'search_termeo%'
;

Všimněte si také, že jsem změnil JOIN posledního na INNER, protože jakákoli podmínka na pravém stole LEFT JOIN (to není "bez shody z tohoto stolu") je v podstatě stejně INNER JOIN.

UNION DISTINCT se používá k zabránění opakování záznamů, které splňují více podmínek, nicméně... pokud companies.company není unikátní (tj. id společnosti 1 s názvem „Blah“ a id společnosti 12 také s názvem „Blah“), pak budou sloučeny i tam, kde by ve vašem původním dotazu nebyly; pokud se jedná o potenciální problém, lze jej napravit tak, že do každého SELECT zahrnete také company_id .




  1. Nelze spustit server:Svázat na portu TCP/IP:Nelze přiřadit požadovanou adresu

  2. Vícenásobné vzestupné pořadí v Mysql nefunguje

  3. Rozdíl mezi datem a časovým razítkem na serveru SQL?

  4. Nelze nainstalovat klenot mysql2 na macOS Sierra