sql >> Database >  >> RDS >> Mysql

Hoe deze eenvoudige Mysql-query te optimaliseren?

OR voorwaarden wanneer niet op hetzelfde veld of bereik gebaseerd (zoals < , > , LIKE ) het vermogen van MySQL om te profiteren van indexen echt verminderen; u kunt query's herstructureren door ze op te splitsen in afzonderlijke, eenvoudigere query's die u vervolgens UNION kunt gebruiken. Door het op deze manier te scheiden, kan MySQL profiteren van een andere index van elke zoekopdracht binnen de UNION's

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%'
;

Merk ook op dat ik de JOIN van de laatste heb gewijzigd in een INNER, aangezien elke voorwaarde op de rechtertafel van een LEFT JOIN (die niet "zonder een match van die tafel" is) in feite sowieso een INNER JOIN is.

UNION DISTINCT wordt gebruikt om te voorkomen dat records die aan meerdere voorwaarden voldoen, worden herhaald, echter... als companies.company niet uniek is (d.w.z. bedrijfs-ID 1 genaamd "Blah" en bedrijfs-ID 12 ook wel "Blah" genoemd), dan zullen deze ook worden samengevoegd waar ze niet in uw oorspronkelijke zoekopdracht zouden staan; als het een potentieel probleem is, kan dat worden verholpen door ook company_id op te nemen in elke SELECT .




  1. Kolomrechten verkrijgen voor een tabel in SQL Server met T-SQL:sp_column_privileges

  2. Hoe substrings wijzigen?

  3. SQL-opdracht niet correct beëindigd bij gebruik van LIMIT

  4. Vreemd probleem met mysqli_stmt_bind_result