Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So optimieren Sie diese einfache MySQL-Abfrage

OR Bedingungen, wenn sie nicht auf demselben Feld oder Bereich basieren (z. B. < , > , LIKE ) verringern die Fähigkeit von MySQL, Indizes zu nutzen, wirklich; Sie können Abfragen neu strukturieren, indem Sie sie in einzelne, einfachere Abfragen zerlegen, die Sie dann VEREINIGEN können. Durch diese Trennung kann MySQL einen anderen Index für jede Abfrage innerhalb der UNIONs nutzen

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%'
;

Beachten Sie auch, dass ich den JOIN des letzten in einen INNER geändert habe, da jede Bedingung auf der rechten Tabelle eines LEFT JOIN (das heißt nicht „ohne Übereinstimmung aus dieser Tabelle“) im Grunde sowieso ein INNER JOIN ist.

UNION DISTINCT wird verwendet, um zu verhindern, dass Datensätze wiederholt werden, die mehrere Bedingungen erfüllen, aber ... wenn companies.company nicht eindeutig ist (d. h. Firmen-ID 1 mit dem Namen "Blah" und Firmen-ID 12 mit dem Namen "Blah"), dann werden diese auch dort zusammengeführt, wo sie in Ihrer ursprünglichen Abfrage nicht enthalten wären; Wenn es sich um ein potenzielles Problem handelt, kann das behoben werden, indem auch company_id in jedes SELECT aufgenommen wird .