delete from table where id in(数万条记录)

时间:2021-11-02 23:21:31
测试delete from table where id in(1,2,3)正常
但是
delete from table where id in(select id from table2)
就卡死了
select id from table2会返回至少5万条记录
该怎么优化这条语句呢?

8 个解决方案

#1


delete a from table1 a inner join table2 b on a.id=b.id

#2


引用 1 楼 ACMAIN_CHM 的回复:
delete a from table1 a inner join table2 b on a.id=b.id

in子查询这个样的语句在mysql5.6之前一直是禁止使用的 效率极差 改成表连接的方式

#3


引用 1 楼 ACMAIN_CHM 的回复:
delete a from table1 a inner join table2 b on a.id=b.id


删除,修改,查询 使用 in 关键字,如果对应的值太多时,都会卡死的,建议使用inner join 替换in  。
替换详细用法,参加我的博客 : http://blog.csdn.net/jenminzhang/article/details/8861148

#4


#5


之所以会卡
是因为子查询的操作会铁定会创建临时表,当然创建内存临时表并不可怕
但是当你数据量大了以后,内存临时表的单表大小限制后,临时表会转换为写磁盘形式的物理内存表

这两个参数决定了你临时表的大小
tmp_table_size  max_heap_table_size

你可以查看这两个状态状态的变化,看你数据库性语句是否有问题。
Created_tmp_disk_tables/Created_tmp_tables<5%   

解决方法的话: 楼上说了,用join语法, 特定的情况才去用子查询

#6


据说用where exists子查询可以提高检索速度,可以试试:
delete from table1 a where exists(select 1 from table2 b where a.id=b.id)

#7


谢谢大家,学习了

#8


该回复于2015-01-17 08:59:10被管理员删除

#1


delete a from table1 a inner join table2 b on a.id=b.id

#2


引用 1 楼 ACMAIN_CHM 的回复:
delete a from table1 a inner join table2 b on a.id=b.id

in子查询这个样的语句在mysql5.6之前一直是禁止使用的 效率极差 改成表连接的方式

#3


引用 1 楼 ACMAIN_CHM 的回复:
delete a from table1 a inner join table2 b on a.id=b.id


删除,修改,查询 使用 in 关键字,如果对应的值太多时,都会卡死的,建议使用inner join 替换in  。
替换详细用法,参加我的博客 : http://blog.csdn.net/jenminzhang/article/details/8861148

#4


#5


之所以会卡
是因为子查询的操作会铁定会创建临时表,当然创建内存临时表并不可怕
但是当你数据量大了以后,内存临时表的单表大小限制后,临时表会转换为写磁盘形式的物理内存表

这两个参数决定了你临时表的大小
tmp_table_size  max_heap_table_size

你可以查看这两个状态状态的变化,看你数据库性语句是否有问题。
Created_tmp_disk_tables/Created_tmp_tables<5%   

解决方法的话: 楼上说了,用join语法, 特定的情况才去用子查询

#6


据说用where exists子查询可以提高检索速度,可以试试:
delete from table1 a where exists(select 1 from table2 b where a.id=b.id)

#7


谢谢大家,学习了

#8


该回复于2015-01-17 08:59:10被管理员删除