またはコード> 同じフィールドまたは範囲に基づいていない場合の条件(
<
など) 、
>コード> 、
LIKE
)インデックスを利用するMySQLの能力を実際に低下させます。クエリを個別の単純なクエリに分割して再構築し、UNIONすることができます。このように分離することで、MySQLは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%'
;
また、LEFT JOINの右側のテーブルの条件(「そのテーブルからの一致なし」ではない)は基本的にINNER JOINであるため、最後のJOINをINNERに変更したことに注意してください。
>
UNION DISTINCT
ただし、複数の条件を満たすレコードが繰り返されないようにするために使用されます... Companies.company
の場合 一意ではありません(つまり、会社ID 1は「Blah」と呼ばれ、会社ID 12は「Blah」とも呼ばれます)。これらは、元のクエリにない場所でもマージされます。潜在的な問題である場合は、各 SELECT
にcompany_idを含めることで解決できます。 。