使用WHERE EXISTS条件时的性能问题

时间:2018-05-04 15:38:36

标签: mysql

我有两个表可容纳GB数据。

当我使用“WHERE EXISTS ...”执行查询时,在任一表上,整个MySQL都会关闭。

查询示例:

DELETE FROM `records`  
where exists (
    select * 
    from `measurements` 
    where `file_id` = 17
    and measurements.id = records.measurement_id
    ) 

我不确定从何处开始调试或如何解决这个问题。

在不同数据库上运行的同一服务器上运行良好但在主数据库上永远运行的查询示例

select * 
from `params` 
where exists (
    select * 
    from `records` 
    where `params`.`record_id` = `records`.`id` and exists (
        select * 
        from `measurements` 
        where `records`.`measurement_id` = `measurements`.`id`
            and `file_id` = 17"
    )
)

2 个答案:

答案 0 :(得分:0)

如果子查询返回任何行,则只需对整个表执行DELETE

DELETE FROM `records`;

我相信你想要相关的子查询:

DELETE FROM `records`  
where exists (
  select * 
  from `measurements` 
  where `file_id` = 17
   and `measurements`.col_name = `records`.col_name 
) ;

修改

  

你对关联部分是正确的。查询仍然将DB降低

您应该检查指标(您要删除的初始表的百分之几)。如果超过20-30%,我只需使用CTAs并重新创建表格。

第二件事:你需要检查FK(ON DELETE CASCADE

答案 1 :(得分:0)

我不得不使用LEFT JOIN重写查询来执行删除。 “存在”花费太长时间的原因是因为“存在”必须根据查询检查每条记录。