mysql - 为什么 MySQL Workbench 中的 'fetch'(如持续时间/获取)对于非常有限的数据量需要很长时间?

标签 mysql query-optimization mysql-workbench

我正在尝试加速我们系统中的一些 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/

相关文章:

sql-server - T-SQL 中多个字段中的相同窗口函数 : optimization?

mysql查询优化: select with counted subquery extremely slow

mysql - 无法保存 MySQL 脚本 (OS X)

mysql - 创建一个触发器来检查出生日期是否有效

mysql - 将 MySQL 表文本值拆分为多行

mysql - 如何在表中插入计算的 SUM

php - 在 Bootstrap 模式中编辑数据

javascript - 对 PHP 和 MySQL 中的特定评论进行评级

c# - 从 MySQL 连接获取数据并将其显示在 TextBox 上

database - 查询高基数字段