首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将这两个查询组合在一起,并使它们具有相同的速度?

如何将这两个查询组合在一起,并使它们具有相同的速度?
EN

Database Administration用户
提问于 2017-12-15 01:49:51
回答 2查看 34关注 0票数 0

我有一个有着数以百万计记录的遗留系统。它的管理和维护非常糟糕,最初是Access数据库。

因此,在一次特定的查找中,我将获取特定员工的资产部署历史记录。在employee表中搜索他们的姓名以找到他们的雇员ID,然后在PC历史表中搜索他们的雇员ID。

现在,我有两个快速查询:

代码语言:javascript
复制
SELECT `tbl_employee`.EMPLID 
FROM `tbl_employee` 
WHERE `tbl_employee`.NAME 
LIKE "%Smith,John%"

上面的查询需要0.0250到0.0850秒才能在基准测试中解析。在本例中,员工ID为518266

我可以在下一个查询中重用这个结果:

代码语言:javascript
复制
SELECT `tbl_pc history`.SerialNumber, `tbl_pc history`.Date, `tbl_pc history`.ModelID 
FROM `tbl_pc history` 
WHERE `tbl_pc history`.`EmployeeNumber` 
LIKE "%518266%";

这也是非常快的,在基准0.0340到0.0679秒之间。

我现在得到了我想要的,一份来自数以百万计的4件物品的清单,这些物品在某个时候发给了这位雇员。

我尝试将这个查询组合了几种方式,它们产生了几次第二次分辨率,而不是每秒的几次:

代码语言:javascript
复制
SELECT `tbl_pc history`.SerialNumber, `tbl_pc history`.Date, `tbl_pc history`.ModelID 
FROM `tbl_pc history` 
WHERE `tbl_pc history`.`EmployeeNumber` 
IN 
    (SELECT tbl_employee.EMPLID 
    FROM tbl_employee 
    WHERE tbl_employee.NAME 
    LIKE "%Smith,John%");

上面的查询得到了我想要的东西,但是执行需要4.8508到6.3010秒。

代码语言:javascript
复制
SELECT `tbl_pc history`.`SerialNumber`, `tbl_pc history`.`Date`, tbl_employee.NAME, `tbl_pc history`.`ModelID` 
FROM `tbl_employee` 
INNER JOIN `tbl_pc history` 
ON `tbl_pc history`.`EmployeeNumber` = tbl_employee.EMPLID 
WHERE `tbl_employee`.`NAME` 
LIKE "%Smith,John%"

这也会导致4-6秒的查询。

请原谅我在这方面的无知--我几乎不了解数据库、SQL、PHP或任何这类知识,在过去几个星期里一直在盲目地搜索我的解决方案。

EN

回答 2

Database Administration用户

发布于 2017-12-18 00:47:20

如果您为这两个表发布SHOW CREATE TABLE,以及每个表有多少行,则会有所帮助。

最有可能的原因是由于使用了LIKE "%Smith,John%"。这将在tbl_employee上执行完整的表扫描。

用这种方式尝试LIKE "Smith,John%",看看查询性能是否更好。我假设您在tbl_employee.name列上有一个索引。

票数 0
EN

Database Administration用户

发布于 2017-12-23 21:13:55

很少有建议:

  1. 如果可能的话,避免在类似搜索中引入通配符。仅仅搜索像"%Smith,John%"而不是"%Smith,John%"就足够了吗?如果没有,请考虑全文索引。
  2. 确保有相应的索引: ALTER tbl_employee ADD INDEX tbl_employee_index_1 (EMPLIDNAME);ALTER tbl_pc history添加索引tbl_pc history_index_1 (EmployeeNumberSerialNumberDateModelID);
票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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