Mysql 使用WHERE EXISTS条件时出现性能问题

Mysql 使用WHERE EXISTS条件时出现性能问题,mysql,Mysql,我有两个表,其中包含GBs的数据 当我在任何一个表上执行带有“WHERE EXISTS…”的查询时,整个MySQL都会崩溃 查询示例: DELETE FROM `records` where exists ( select * from `measurements` where `file_id` = 17 and measurements.id = records.measurement_id ) 我不知道从哪里开始调试,也不知道如何解决这个

我有两个表,其中包含GBs的数据

当我在任何一个表上执行带有“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"
    )
)

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

DELETE FROM `records`;
我相信您需要关联子查询:

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


关于相关部分,您是正确的。查询仍在关闭数据库

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


第二件事:您需要检查FK(
关于DELETE CASCADE

我必须使用左连接重写查询以执行删除。“exists”花费的时间太长的原因是因为“exists”必须对照查询检查每条记录。

子查询上需要关联&使用1代替*您不需要选择上的任何值,并且返回从不使用它们的列似乎是浪费;特别是如果表中有很多列。还有,你有关于文件\u ID和measurements.ID的索引吗?我已经在我的帖子中调整了查询,谢谢你指出,但是数据库仍然在下降。关于文件\u ID、measurements.ID和records.measurement\u ID的索引?记录上也有很多索引?如果是这样,delete必须管理所有索引。您可能需要禁用它们,然后在删除完成后重建。如果你在“记录”中有很多索引和记录,我在measurements.file_id和records.mesaurement_id上有索引。measurements.id和records.id都是主键。我发现如果我在exists()中进行查询,一切都正常。这同样适用于删除所选记录时。但是,当我使用exists()进行选择或删除时,我遇到了问题。如果您只是使用exists选择记录,它是否会很快完成<代码>从存在的记录中选择*。(2155条记录有多少条?)如果是这样,我认为这是删除记录量的索引管理。所以,禁用索引,然后在删除完成后启用并重新引用可能就是答案。关于相关部分,您是正确的。查询仍在进行中。我刚刚意识到这两个表都是MyISAM,所以删除级联不适用。在测试场景中,我删除了2155行。一个表有14mil记录,第二个表有205mil记录。我发现如果我在exists()中进行查询,一切都正常。这同样适用于删除所选记录时。但是,当我使用exists()进行选择或删除时,我遇到了问题。