首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以只运行一次子查询作为孤岛查询吗?

问可以只运行一次子查询作为孤岛查询吗?
EN

Database Administration用户
提问于 2021-11-06 17:39:20
回答 1查看 116关注 0票数 0

我在下面的列first_name、last_name和company_id上都有一个带有单一索引的users表。

运行此查询。

代码语言:javascript
复制
SELECT 
    *
FROM
    `users`
WHERE
    (`first_name` LIKE 'bill%'
        OR `last_name` LIKE 'bill%' 
OR company_id in (100))

按预期使用所有索引:

但是,运行此修改后的查询时,不使用任何索引:

代码语言:javascript
复制
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执行子查询?

代码语言:javascript
复制
SELECT 
    `id`
FROM
    `companies`
WHERE
    `name` LIKE 'bill%'

只有一次独立的,而不是每一次的查询再次?

编辑:这是与联接:

代码语言:javascript
复制
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):

EN

回答 1

Database Administration用户

回答已采纳

发布于 2021-11-07 00:33:52

经典解决方案:OR -> UNION:

代码语言:javascript
复制
( 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设计了不同的索引:

代码语言:javascript
复制
INDEX(first_name),
INDEX(last_name),
INDEX(company_id)

这些对性能没有任何帮助:JOIN、CTE、WITH、LEFT JOIN、子查询、派生表。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/302237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档