我在下面的列first_name、last_name和company_id上都有一个带有单一索引的users表。
运行此查询。
SELECT
*
FROM
`users`
WHERE
(`first_name` LIKE 'bill%'
OR `last_name` LIKE 'bill%'
OR company_id in (100))按预期使用所有索引:

但是,运行此修改后的查询时,不使用任何索引:
SELECT
*
FROM
`users`
WHERE
(`first_name` LIKE 'bill%'
OR `last_name` LIKE 'bill%' Or company_id in (
SELECT
`id`
FROM
`companies`
WHERE
`name` LIKE 'bill%'
) )
相反,它遍历所有用户记录,并对每个用户执行子查询。
这让我想知道,是否可以告诉SQL执行子查询?
SELECT
`id`
FROM
`companies`
WHERE
`name` LIKE 'bill%'只有一次独立的,而不是每一次的查询再次?
编辑:这是与联接:
SELECT
*
FROM
`users`
INNER JOIN
`companies` ON `companies`.`id` = `users`.`company_id`
WHERE
(`first_name` LIKE 'bill%'
OR `last_name` LIKE 'bill%'
OR `companies`.`name` LIKE 'bill%')它的速度要慢得多,没有索引用于users表,我还在companies上索引(id、name),以及(company_id、first_name)和(comapny_id,last_name):

发布于 2021-11-07 00:33:52
经典解决方案:OR -> UNION:
( SELECT * FROM users WHERE first_name LIKE 'bill%' )
UNION DISTINCT
( SELECT * FROM users WHERE last_name LIKE 'bill%' )
UNION DISTINCT
( SELECT * FROM users WHERE company_id in (100) )为每个SELECT设计了不同的索引:
INDEX(first_name),
INDEX(last_name),
INDEX(company_id)这些对性能没有任何帮助:JOIN、CTE、WITH、LEFT JOIN、子查询、派生表。
https://dba.stackexchange.com/questions/302237
复制相似问题