首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何改进select查询,使其更快?

如何改进select查询,使其更快?
EN

Stack Overflow用户
提问于 2016-11-22 10:14:30
回答 3查看 83关注 0票数 2

我有一个员工表(大约450万),其中有名为job_titledomain的列。

我希望能够创建并运行动态查询,以便根据职务名称选择特定的员工,并且其域也位于所提供的域数组中。

它是如何工作的,是前端的用户最终得到一个大的域数组(从200到10,000+),然后输入两样东西:

  1. 他们想要的职位包括
  2. 他们希望排除的哪个职位

因此,我们构建了一个查询,结果如下所示:

代码语言:javascript
运行
复制
SELECT employee_id
FROM employee
WHERE (
        domain LIKE '%shetlandfoods.co.uk' 
        OR domain LIKE '%example1.co.uk' 
        OR domain LIKE '%example2.co.uk'

        -- About 50 additional domains in this list

        OR domain LIKE '%example50.co.uk'
    ) 
    AND (job_title LIKE '%Manager%' OR job_title LIKE '%Director%') 
    AND (job_title NOT LIKE '%Assistant%')

(注意到,域列表非常长,可能包含数千个域(!))

现在,这样的查询大约需要230秒,而且只有大约180个域!想象一下使用成千上万的,这将是永远的。

我想知道是否有任何方法可以优化/更改这个查询,使其运行得更快一些?或者我能对数据库做些什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-22 10:27:11

这里有两种选择(第二种选择由@paul在上面的评论中提出)。

其一,您可以对domain列中的数据进行预处理,使其只具有确切的域而没有其他内容。这是一个众所周知的问题,在Java或JavaScript中相对容易处理.如果这样做了,那么您可以在domain列上添加一个索引,并使用一个WHERE子句,如下所示:

代码语言:javascript
运行
复制
WHERE domain IN ('shetlandfoods.co.uk',
                 'alac.shetland.co.uk',
                 'malakofflimited.co.uk',
                 ...)

另一种选择可能是将域的反向与原始WHERE子句中的条件相反进行比较。

代码语言:javascript
运行
复制
WHERE REVERSE(domain) LIKE 'ku.oc.sdoofdnaltehs%' OR
      REVERSE(domain) LIKE 'ku.oc.dnaltehs.cala%' OR
      REVERSE(domain) LIKE 'ku.oc.detimilffokalam%' OR
      ...

您甚至可以从应用程序/UI层存储domain的反向,这样就不必强迫MySQL为WHERE子句中的每个项计算反向。

我可能倾向于第一种选择,假设您在访问MySQL之前有足够的带宽来提取域。

票数 3
EN

Stack Overflow用户

发布于 2016-11-22 10:36:14

您可以为这种场景创建临时表,如下所示:

代码语言:javascript
运行
复制
CREATE TEMPORARY TABLE domain_values (
  domain_value VARCHAR(100)
);

然后插入所有域如下:

代码语言:javascript
运行
复制
INSERT INTO domain_values  VALUES ('%shetlandfoods.co.uk'), ('%shopshetlandtoday.co.uk'), ........;

然后选择如下:

代码语言:javascript
运行
复制
SELECT e.employee_id FROM employee e JOIN domain_values d ON (e.domain LIKE d.domain_value)  AND
     (e.job_title LIKE '%Manager%' OR e.job_title LIKE '%Director%') AND (e.job_title NOT LIKE '%Assistant%');
票数 0
EN

Stack Overflow用户

发布于 2016-11-22 11:05:48

倒转文本,如

WHERE REVERSE(domain) LIKE 'ku.oc.sdoofdnaltehs%' OR REVERSE(domain) LIKE 'ku.oc.dnaltehs.cala%' OR REVERSE(domain) LIKE 'ku.oc.detimilffokalam%'...

是一种选择,你可以尝试另一种--你也可以试试

SELECT employee_id FROM employee WHERE INSTR( domain,'shetlandfoods.co.uk' ) > 0

这比LIKE %text%

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

https://stackoverflow.com/questions/40739124

复制
相关文章

相似问题

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