Mysql
 sql >> Database >  >> RDS >> Mysql

Come ottimizzare questa semplice query di MySQL

OR condizioni quando non si trovano sullo stesso campo o basato sull'intervallo (come < , > , LIKE ) diminuire davvero la capacità di MySQL di sfruttare gli indici; puoi ristrutturare le query suddividendole in quelle separate più semplici che puoi quindi UNION. Separarlo in questo modo consente a MySQL di sfruttare un indice diverso di ogni query all'interno delle 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%'
;

Inoltre, nota che ho cambiato l'ultimo JOIN in un INNER poiché qualsiasi condizione sulla tabella di destra di un LEFT JOIN (che non è "senza una corrispondenza da quella tabella") è fondamentalmente comunque un INNER JOIN.

UNION DISTINCT viene utilizzato per impedire che i record che soddisfano più condizioni vengano ripetuti, tuttavia... se companies.company non è univoco (ad es. ID azienda 1 chiamato "Blah" e ID azienda 12 chiamato anche "Blah"), anche quelli verranno uniti dove non sarebbero nella query originale; se si tratta di un potenziale problema, è possibile porre rimedio includendo anche company_id in ogni SELECT .