我有一个有着数以百万计记录的遗留系统。它的管理和维护非常糟糕,最初是Access数据库。
因此,在一次特定的查找中,我将获取特定员工的资产部署历史记录。在employee表中搜索他们的姓名以找到他们的雇员ID,然后在PC历史表中搜索他们的雇员ID。
现在,我有两个快速查询:
SELECT `tbl_employee`.EMPLID
FROM `tbl_employee`
WHERE `tbl_employee`.NAME
LIKE "%Smith,John%"上面的查询需要0.0250到0.0850秒才能在基准测试中解析。在本例中,员工ID为518266。
我可以在下一个查询中重用这个结果:
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件物品的清单,这些物品在某个时候发给了这位雇员。
我尝试将这个查询组合了几种方式,它们产生了几次第二次分辨率,而不是每秒的几次:
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秒。
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或任何这类知识,在过去几个星期里一直在盲目地搜索我的解决方案。
发布于 2017-12-18 00:47:20
如果您为这两个表发布SHOW CREATE TABLE,以及每个表有多少行,则会有所帮助。
最有可能的原因是由于使用了LIKE "%Smith,John%"。这将在tbl_employee上执行完整的表扫描。
用这种方式尝试LIKE "Smith,John%",看看查询性能是否更好。我假设您在tbl_employee.name列上有一个索引。
发布于 2017-12-23 21:13:55
很少有建议:
"%Smith,John%"而不是"%Smith,John%"就足够了吗?如果没有,请考虑全文索引。tbl_employee ADD INDEX tbl_employee_index_1 (EMPLID,NAME);ALTER tbl_pc history添加索引tbl_pc history_index_1 (EmployeeNumber,SerialNumber,Date,ModelID);https://dba.stackexchange.com/questions/193183
复制相似问题