Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment optimiser cette simple requête Mysql

OR conditions lorsqu'elles ne sont pas sur le même champ ou sur la même plage (comme < , > , LIKE ) réduisent vraiment la capacité de MySQL à tirer parti des index ; vous pouvez restructurer les requêtes en les décomposant en requêtes plus simples que vous pouvez ensuite UNION. Le séparer ainsi permet à MySQL de tirer parti d'un index différent de chaque requête au sein des 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%'
;

Notez également que j'ai changé le dernier JOIN en INNER car toute condition sur la table de droite d'un LEFT JOIN (qui n'est pas "sans correspondance de cette table") est fondamentalement une INNER JOIN de toute façon.

UNION DISTINCT est utilisé pour empêcher la répétition d'enregistrements remplissant plusieurs conditions, cependant... if companies.company n'est pas unique (c'est-à-dire que l'identifiant d'entreprise 1 appelé "Blah" et l'identifiant d'entreprise 12 également appelé "Blah"), ceux-ci seront également fusionnés là où ils ne seraient pas dans votre requête d'origine ; s'il s'agit d'un problème potentiel, il peut être résolu en incluant également company_id dans chaque SELECT .