但是
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
in子查询这个样的语句在mysql5.6之前一直是禁止使用的 效率极差 改成表连接的方式
#3
删除,修改,查询 使用 in 关键字,如果对应的值太多时,都会卡死的,建议使用inner join 替换in 。
替换详细用法,参加我的博客 : http://blog.csdn.net/jenminzhang/article/details/8861148
#5
之所以会卡
是因为子查询的操作会铁定会创建临时表,当然创建内存临时表并不可怕
但是当你数据量大了以后,内存临时表的单表大小限制后,临时表会转换为写磁盘形式的物理内存表
这两个参数决定了你临时表的大小
tmp_table_size max_heap_table_size
你可以查看这两个状态状态的变化,看你数据库性语句是否有问题。
Created_tmp_disk_tables/Created_tmp_tables<5%
解决方法的话: 楼上说了,用join语法, 特定的情况才去用子查询
是因为子查询的操作会铁定会创建临时表,当然创建内存临时表并不可怕
但是当你数据量大了以后,内存临时表的单表大小限制后,临时表会转换为写磁盘形式的物理内存表
这两个参数决定了你临时表的大小
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)
delete from table1 a where exists(select 1 from table2 b where a.id=b.id)
#7
谢谢大家,学习了
#8
#1
delete a from table1 a inner join table2 b on a.id=b.id
#2
in子查询这个样的语句在mysql5.6之前一直是禁止使用的 效率极差 改成表连接的方式
#3
删除,修改,查询 使用 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语法, 特定的情况才去用子查询
是因为子查询的操作会铁定会创建临时表,当然创建内存临时表并不可怕
但是当你数据量大了以后,内存临时表的单表大小限制后,临时表会转换为写磁盘形式的物理内存表
这两个参数决定了你临时表的大小
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)
delete from table1 a where exists(select 1 from table2 b where a.id=b.id)
#7
谢谢大家,学习了