ELLER
villkor när de inte är baserade på samma fält eller intervall (som <
). , > ,
GILLA
) verkligen minska MySQL:s förmåga att dra fördel av index; du kan omstrukturera frågor genom att dela upp dem i separata enklare som du sedan kan UNION. Genom att separera det så här kan MySQL dra fördel av ett annat index för varje fråga inom UNIONs
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%'
;
Observera också att jag ändrade den senaste JOIN till en INNER eftersom alla villkor på bordet till höger i en LEFT JOIN (det är inte "utan en match från den tabellen") i princip är en INNER JOIN ändå.
UNION DISTINCT
används för att förhindra att poster som uppfyllde flera villkor upprepas, men... om företag.företag
inte är unikt (dvs. företags-id 1 kallat "Blah" och företags-ID 12 även kallat "Blah") så kommer de också att slås samman där de inte skulle finnas i din ursprungliga fråga; om det är ett potentiellt problem kan det åtgärdas genom att även inkludera company_id i varje SELECT
.