什么是更快,多删除或删除mysql中的多表?

时间:2014-09-14 11:04:31

标签: mysql mysql-workbench

这是什么更快

/ *删除用户树点* /

delete from tb_tree_points where user_guid=P_user_guid ;

/ *删除tb_user_setting * /

delete from tb_user_setting where user_guid=P_user_guid ;

delete from tb_tree_points as s left outer join tb_user_setting  as u
on u.user_guid=s.user_guid
where u.user_guid=s.user_guid=P_user_guid ;

作为一个查询

2 个答案:

答案 0 :(得分:1)

如果您不需要在单个事务中运行它们,则2个查询更好。如果它们在一个查询中,您将在两个表上保持锁定,同时删除两个表中的数据;在单独的查询版本中,您将释放第一个表上的锁,然后获取另一个表上的锁。

如果您对性能感兴趣,我假设您将使用更大的数据集执行此操作。如果数据集很小则没关系 - 正如你所说它们都需要同时进行。如果它很大,我会更感兴趣的是锁定表的时间。因此,我会在循环中运行查询,但有一些限制,以允许在执行操作时运行其他查询。同样,这取决于要求 - 您是否能够只删除一些记录。如果您必须删除单个原子事务中的所有内容,那么唯一的选择是将查询与实际大小的数据集进行比较,并查看是否存在相当大的差异。

答案 1 :(得分:0)

这是一个评论。第二个查询的正确格式更像是:

delete s, u
    from tb_tree_points s left outer join
         tb_user_setting u
         on u.user_guid = s.user_guid
    where u.user_guid = P_user_guid ;

假设两个表中都有user_guid的索引,我希望这两个查询都具有可比性。使用join版本可能会有更多的开销。它的优点是是单个语句,因此是单个事务(取决于存储引擎)。

双语句版本具有简单的优点。如果没有适当的索引(两个全表扫描而不是嵌套循环连接),它应该更快。而且,它是所有数据库都支持的标准SQL。