MySQL 联表查询重复数据并删除(子查询删除记录) SQL优化

这篇具有很好参考价值的文章主要介绍了MySQL 联表查询重复数据并删除(子查询删除记录) SQL优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、业务逻辑及表介绍

数据库表介绍:
table_a:主表(小表,表数据不可重复)
table_b:流水表(大表,记录审核流水数据)
注:两表表结构大致一致,流水表增加一个审核状态的字段

业务逻辑:
主表保存唯一数据,流水表记录审核流水数据,用于后续展示,并在审核成功后插入主表,在插入流水数据时完成重复数据的覆盖。覆盖逻辑为先删后加,也就是在这里,出现了联表删除慢的问题。

2、优化思路

原联表删除SQL语句 :
delete from table_a where id in (SELECT id FROM table_b );

优化后的联表删除SQL语句(懒得继续看的,到这即可) :
delete from table_a where exists (SELECT t.id from (select a.id from table_a a,table_b b where a.id=b.id) t where a.id=table_a.id);

3、优化原理:

本次优化总结讲是将in ==》exists

a、那一定是exists比in语句的效率高吗?

mysql中的 in 语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。所以可见,这种说法其实是不准确的。实际是要区分环境的:

  1. 如果查询的两个表大小相当,那么用in和exists差别不大。
  2. 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。
  3. 此外,in与exists的索引使用情况为:in 前表索引,exists 后表索引,用上索引的快。

b、not in 和not exists的比较:

  1. not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;
  2. not extsts 的子查询依然能用到表上的索引。

结论: 无论哪个表大,用not exists都比not in要快

c、in 与 = 的区别不大

验证过程略…(感兴趣的话自行验证哈(o-))

4、记录一个优化过程中遇到的问题

sql: delete from table_a where exists (select a.idfrom table_a a,table_b b where a.id=b.id);
报错: You can’t specify target table ‘table_a’ for update in FROM clause(不能在FROM子句中为更新指定目标表)
解决方法: mysql 可以通过子查询得到要删除的记录条件,然后通过子查询得结果匹配要删除的记录。但是 mysql 不能直接删除子查询表中的数据,必须通过一个临时表来解决。文章来源地址https://www.toymoban.com/news/detail-402874.html

到了这里,关于MySQL 联表查询重复数据并删除(子查询删除记录) SQL优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL语句删除重复记录且只保留一条有效记录

    1. 查找表中多余的重复记录,重复记录是根据单个字段(name)来判断 2. 删除表中多余的重复记录,重复记录是根据单个字段(id)来判断,只留有id最小的记录 3. 删除表中多余的重复记录(多个字段),只留有id最小的记录 参考:https://blog.csdn.net/JineD/article/details/126875291

    2024年02月13日
    浏览(57)
  • 分享SQL重复记录查询的几种方法

      SQL重复记录查询的几种方法,需要的朋友可以参考一下 1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 代码如下: select * from people where peopleId in (select   peopleId from   people group by   peopleId having count (peopleId) 1) 2、删除表中多余的重复记录,重复记录

    2024年02月12日
    浏览(50)
  • MySQL 数据库查询与数据操作:使用 ORDER BY 排序和 DELETE 删除记录

    使用 ORDER BY 语句按升序或降序对结果进行排序。 ORDER BY 默认按升序排序。要按降序排序结果,使用 DESC 。 示例按名称按字母顺序排序结果: ORDER BY DESC 使用 DESC 以降序排序结果。 示例按名称以字母逆序排序结果: 您可以使用\\\"DELETE FROM\\\"语句从现有表格中

    2024年02月05日
    浏览(78)
  • mysql表中删除重复记录,只保留一条记录的操作

    mysql表中两个字段重复记录,只保留一条记录的操作 例如有一张学生表 其中name 和 class 相同的视为重复记录,需要保留一条记录,删除重复记录, 两种操作方式如下: 方法一: group by 查询结果如下: 此操作找出了需要保留的记录,即按name、class进行分组,取出id最小的记录

    2024年02月09日
    浏览(52)
  • SQL删除重复的记录(只保留一条)-窗口函数row_number()

    关于删除mysql表中重复数据问题,本文中给到两种办法:聚合函数、窗口函数row_number()的方法。 (注意:MySQL从8.0开始支持窗口函数) 测试数据准备:首先创建一个测试表test,插入一些测试数据,模拟一些重复数据(最终目标:删除重复数据,但不处理null行) 先查询下重复数

    2024年02月05日
    浏览(46)
  • 玩转MySQL数据库之SQL优化之慢查询

    本系列为:MySQL数据库详解,为千锋资深教学老师独家创作,致力于为大家讲解清晰MySQL数据库相关知识点,含有丰富的代码案例及讲解。如果感觉对大家有帮助的话,可以【关注】持续追更~ 文末有本文重点总结,技术类问题,也欢迎大家和我们沟通交流! 从今天开始本系列

    2024年02月06日
    浏览(89)
  • Mysql 复杂查询丨联表查询

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 联表查询(Join)是一种在数据库中使用多个表进行关联查询的操作。它通过使用 JOIN 将多个表连接在一起,并根据关联条件从这些表中检索数据 INNER JOIN(内连接) 内连接(Inner Join)是一种在联表查询中使用的

    2024年02月13日
    浏览(38)
  • SQL Server删除重复数据的方法

    在SQL Server中,有多种方法可以删除重复数据。下面将介绍几种常用的方法,并提供相应的源代码示例。 方法一:使用DISTINCT和临时表 使用DISTINCT可以去除重复的行,我们可以将去重后的结果插入到一个临时表中,然后删除然后删除原始表中的数据,最后将临时表中的数

    2024年02月04日
    浏览(47)
  • QueryWrapper构建复杂的SQL-循环添加条件、联表查询

    QueryWrapper是MyBatis-Plus提供的一个查询构建器,用于构建复杂的SQL查询语句。QueryWrapper可以用于添加条件、排序、分页等操作。 循环添加条件 在QueryWrapper中,可以使用andWhere和orWhere方法来添加多个条件,从而实现循环添加条件。 下面是一个示例代码,演示如何使用QueryWrapper循

    2024年02月16日
    浏览(46)
  • 查询数据库中的重复数据记录

    ========第一篇========= 在一张表中某个字段下面有重复记录,有很多方法,但是有一个方法,是比较高效的,如下语句: select data_guid from adam_entity_datas a where a.rowid (select min(b.rowid) from adam_entity_datas b where b.data_guid = a.data_guid) 如果表中有大量数据,但是重复数据比较少,那么可以

    2024年02月07日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包