我正在尝试加速我们系统中的一些 SQL 查询。
有问题的查询之一具有非常慢的“IN”子句。我读到,我可以在查询中构建一个临时表(使用 UNION ALL),并在该表上进行联接,以改进“IN”子句中隐式“OR”引起的问题。 (见下文)
旧查询在我们的系统上运行大约需要 12 秒(11.8 秒持续时间/0.015 秒获取)。新查询的持续时间约为 0.15 秒,但是,新查询的提取时间超过 11 秒!)两个查询返回相同的数据。大约 236 条记录,每条记录有 30 个字段。
谁能告诉我这里发生了什么?为什么获取几千字节的数据需要几秒钟的时间?
旧查询:
SELECT
*
FROM
patients
LEFT JOIN patients_billing ON patients.`seq` = patients_billing.`patient_seq`
WHERE
patients.`location` = "XYZ Company"
AND patients.`status` = "READY"
AND patients.`created` >= "2021-02-15"
AND patients.`sub_location` IN(
'location 1',
'location 2', 'location 3',
'location 4',
'location 5',
'location 6',
'location 7',
'location 8',
'location 9',
'location 10',
'location 11',
'location 12',
'location 13',
'location 14',
'location 15',
'location 16',
''
);
新查询:
SELECT
*
FROM
patients
LEFT JOIN patients_billing ON patients.`seq` = patients_billing.`patient_seq`
INNER JOIN (
SELECT 'location 1' as sub_location
UNION ALL
SELECT 'location 2' as sub_location
UNION ALL
SELECT 'location 3' as sub_location
UNION ALL
SELECT 'location 4' as sub_location
UNION ALL'
SELECT 'location 5' as sub_location
UNION ALL
SELECT 'location 6' as sub_location
UNION ALL
SELECT 'location 7' as sub_location
UNION ALL
SELECT 'location 8' as sub_location
UNION ALL
SELECT 'location 9' as sub_location
UNION ALL
SELECT 'location 10' as sub_location
UNION ALL
SELECT 'location 11' as sub_location
UNION ALL
SELECT 'location 12' as sub_location
UNION ALL
SELECT 'location 13' as sub_location
UNION ALL
SELECT 'location 14' as sub_location
UNION ALL
SELECT 'location 15' as sub_location
UNION ALL
SELECT 'location 16' as sub_location
UNION ALL
SELECT '' as sub_location
) as mf_table
ON mf_table.sub_location = patients.sub_location
WHERE
patients.`location` = "XYZ Company"
AND patients.`status` = "READY"
AND patients.`created` >= "2021-02-15";
请随时提出任何问题以进行澄清。
谢谢!
最佳答案
持续时间是 Workbench 检索结果集第一行所花费的时间。
Fetch 是检索其余行所需的时间。
看起来两个查询完成所需的时间大致相同。查询的 UNION ALL 公式会快速交付第一行,然后逐渐输出其余行。您的 IN () 公式让 MySQL 服务器收集所有行,然后立即将它们发送给您。
在这两种情况下,MySQL 可能会重复扫描整个 患者
表以一一查找匹配项。
我怀疑使用这些索引可以使这两种公式变得更快。
CREATE INDEX patient_billing_x ON patients (status, location, created, seq);
CREATE INDEX billing_patient_x ON patients_billing (patient_seq);
顺便说一句,您问题中的查询有些令人费解。您的 WHERE 子句在两个冲突的地方都提到了 patents.location
...
WHERE patients.location = 'XYZ Company'
AND patients.location IN ('this', 'that', 'anything', 'but not XYZ Company')
使用该 WHERE 子句不应返回任何行。
关于mysql - 为什么 MySQL Workbench 中的 'fetch'(如持续时间/获取)对于非常有限的数据量需要很长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66923090/