sql >> Databasteknik >  >> RDS >> Mysql

Hur man optimerar denna enkla Mysql-fråga

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 .




  1. Hur man installerar ArangoDB på Ubuntu 20.04

  2. Hur man tar bort ledande blanksteg i MySQL

  3. fel vid installation av psycopg2, bibliotek hittades inte för -lssl

  4. MySQL avvisar kolumn med ON DELETE SET NULL men inte ON DELETE CASCADE