OR
condiciones cuando no están basadas en el mismo campo o rango (como <
, >
, LIKE
) realmente disminuyen la capacidad de MySQL para aprovechar los índices; puede reestructurar las consultas dividiéndolas en otras más simples separadas que luego puede UNION. Separarlo de esta manera permite que MySQL aproveche un índice diferente de cada consulta dentro de 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%'
;
Además, tenga en cuenta que cambié el último JOIN a INNER ya que cualquier condición en la tabla de la derecha de LEFT JOIN (que no es "sin una coincidencia de esa tabla") es básicamente un INNER JOIN de todos modos.
UNION DISTINCT
se utiliza para evitar que se repitan los registros que cumplieron varias condiciones, sin embargo... if companies.company
no es único (es decir, la identificación de la compañía 1 se llama "Blah" y la identificación de la compañía 12 también se llama "Blah"), entonces también se fusionarán donde no estarían en su consulta original; si se trata de un problema potencial, se puede remediar incluyendo también company_id en cada SELECT
.