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

2023-11-11

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 不能直接删除子查询表中的数据,必须通过一个临时表来解决。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Sql批量复制截断小数

    当我使用批量复制将十进制值从 C DataTable 插入 Sql Server 2005 时 值会被截断而不是四舍五入 DataTable 中的数据类型为 Decimal 数据库中的数据类型为Decimal 19 3 数据表中的值为 1
  • Solr 增量导入不起作用

    我使用的是solr 4 2 请注意 完全导入有效 但增量导入却无效 增量导入不会给出任何错误 但不会获取任何更改 这是数据配置文件
  • 如何绑定值 INSERT INTO mysql perl

    我有下面的代码可以工作 但我需要知道如何绑定它们以确保安全 如果我只是将 new row 替换为 并将其放入执行中我收到错误 感谢您的帮助 foreach my field account field order new row param
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • Unicode(希腊语)字符存储在数据库中,例如“??????”

    数据库中的希腊字符就像问号 我找不到解决办法 我使用 Java Swing 开发了一个应用程序 但是当我在 MySQL 中插入希腊字母时 就像问号一样 我将数据库排序规则更改为 utf8 并将列也更改为 utf8 我的项目编码设置为UTF
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的
  • 从两个表中搜索然后删除

    我有两个包含成员数据的表 与 member id 列链接 我需要搜索所有记录email列以 pl 结尾 然后 我需要为此删除两个表中的所有记录 基于 member id 是否可以通过一条 SQL 语句完成此操作 SELECT member
  • 如何将 SQL 结果存入 STRING 变量?

    我正在尝试获取 C 字符串变量或字符串数 组中的 SQL 结果 是否可以 我需要以某种方式使用 SqlDataReader 吗 我对 C 函数和所有功能非常陌生 曾经在 PHP 中工作 所以如果可以的话请给出一个工作示例 如果相关 我已经可
  • 从VBA中的数组批量插入到sql中

    我正在尝试在 Excel 中构建一个按钮 将所选区域上传到 SQL Server 中的表中 第一行将自动视为列标题 这件事该怎么继续下去呢 我想要的是简单和超快的上传 这是我的想法 我将选择选定的区域 然后将其保存为 txt 文件 然后对其
  • 在 PHP 中比较字符串的方式与 MySQL 相同

    我将 varchar 存储在 utf8 MySQL 表中并使用 utf8 general ci 排序规则 我在 varchar 上有一个唯一索引 我想在 PHP 中进行字符串比较 这相当于 MySQL 对索引所做的操作 一个具体的例子是 我
  • MySQL如何根据字段是否存在来插入新记录或更新字段?

    我正在尝试实现一个评级系统 在数据库表中保留以下两个字段 评级 当前评级 num rates 迄今为止提交的评分数量 UPDATE mytable SET rating rating num rates theRating num rate
  • Oracle SQL——从字符串中删除部分重复项

    我有一个表 其中有一列包含字符串 如下所示 static text here 1abcdefg1abcdefgpxq 从这个字符串1abcdefg重复两次 所以我想删除该部分字符串 然后返回 static text here 1abcdef
  • 标记个体内事件发生后发生的日期

    我有一组长格式的数据 每人几行 人 id 其中事件 事件 1 应该只发生一次 事件发生后 该人不应再有任何数据 如果事件发生后出现任何记录 我想使用名为 flag flag 1 的新变量创建一个查询 例如 下面标记了 id 5 因为在该人的
  • 如何通过Object Id和Column Id查询表数据?

    有桌子Clients PK LastName Name Address 1 Vidal Arturo St 2 Lavezzi Ezequiel St 3 Cuadrado Guillermo St 我想得到 通过以下查询 我可以得到前四列
  • SQL 用新值替换旧值

    我有一个名为tbl Products 其中有一列名为articlenumber并且充满了像这样的数字s401 s402 etc 我生成了一个包含新商品编号的列表 它将替换旧的商品编号 s401 I00010 s402 I00020 s403
  • 仅从数据库获取我想要的数据但保留结构

    我正在尝试在 powerbi 上执行此操作 但我想这只是基本的 SQL 我想将我的数据导入到 powerBi 中 但使用一些 id 对其进行过滤 我们以这个例子为例 我与一些公司有数据库 表1 每个公司都有建筑物 表2 每个建筑物有员工 表
  • 解码Json数据数组并插入到mysql

    这个问题可能已经在这里问过 但我尝试搜索找不到它 我有如下 Json 数据 CityInfo CityCode 5599 Name DRUSKININKAI CityCode 2003 Name KAUNAS CityCode 2573 N
  • MySQL获取最后10条记录中的第一条记录

    在Mysql中 我试图获取最后10条记录中最旧的记录 为了得到最后 10 个我会简单地做SELECT FROM table ORDER BY id DESC LIMIT 10 为了获得最旧的 我只需使用 ASC 顺序 我需要首先按 DESC
  • 使用另一个表中的数据查找并替换 MySQL 中的字符串

    我有两个 MySQL 表 我想使用另一个表中的数据查找和替换一个表中的文本字符串 Table texts messages thx guys i think u r great thx again u rock Table dictiona
  • PHP:使用输入和输出参数(不是“INOUT”)调用 MySQL 存储过程

    我想从 PHP 调用 MySQL 中的存储过程 该过程需要输入and输出参数 not INOUT 参数 举一个简单的例子 假设我在 MySQL 中有以下存储过程 DELIMITER DROP PROCEDURE IF EXISTS test

随机推荐

  • 如何让Element UI的Message消息提示每次只弹出一个

    Element UI的Message消息提示是点击一次触发一次的 在开发的时候经常会作为一些校验提示 但是公司的测试人员在进行测试时会一直点 然后就会出现如下图的情况 虽然客户使用的时候一般来说不会出现这种情况 毕竟客户不会闲着没事一直点点
  • 用 visio 2013反转图形或镜像图形

    软件版本 visio 2013 选择待反转图形 依次点击 开始 位置 旋转形状 即可根据需求进行图形反转 若需要进行图形镜像操作 可提前将图形复制出一份 将复制出来的图形进行垂直反转或水平反转
  • 2020年tensorflow定制训练模型笔记(3)——开始训练

    现在 我们开始训练文件 这里 我将用一些训练好的模型来做迁移训练 这里简单介绍一下迁移训练 迁移训练就是在别人训练的模型基础上继续训练 这样我们的模型训练就不是从零开始 加快速度以及提高准确率 我讲的比较简单 参考网址在这 https bl
  • 华为OD题目:快递投放问题

    华为OD题目 快递投放问题 有N个快递站点用字符串标识 某些站点之间有道路连接 每个站点有一些包裹要运输 每个站点间的包裹不重复 路上有检查站会导致部分货物无法通行 计算哪些货物无法正常投递 输入描述 1 第一行输入M N M个包裹N个道路
  • python中的random和range

    random import random print random randint 1 10 产生 1 到 10 的一个整数型随机数 包括1和10 print random random 产生 0 到 1 之间的随机浮点数 print ra
  • 靶场 : upload-labs1-10

    搭建 用phpstudy搭建的 搭建很简单 下载源码 放置在phpstudy的根目录下 在phpstudy中创建 步骤 这里上传的文件内容是一句话木马 pass 1 上传一个php文件试一试 传不上的 使用的白名单过滤的 我们考虑一下是什么
  • 12个超好用的配色网站

    每次做海报做ppt的时候总是为配色发愁 到底怎样才能调出好看的配色方案呢 调着调着感觉自己已经是个色盲了 今天小编就给你们带来了福利 12个超好用的配色网站推荐 01 Material Palette 网站地址 http www mater
  • 【SpringCloud】四、Spring Cloud Config

    Spring Cloud Config 前言 一 什么是配置中心 1 为什么需要分布式配置中心 2 常用分布式配置中心框架 二 什么是Spring Cloud Config 1 Springcloud config 的工作原理 2 构建 S
  • truffle教程

    直接在geth的控制台通过solc进行编译部署的示例已经很多了 比如这篇博客 此处不再赘述 本文主要演示怎样通过truffle部署以太坊智能合约 truffle是一个以太坊智能合约开发框架 它会帮你做很多琐碎的事情 安装使用都很简单 1 安
  • element-ui页面加载正确,页码错误

    期望效果 进入详情前第二页 从详情返回后还在第二页 先说我之前的误区 哈哈 之前想的是路由跳转时传参到详情页 详情页跳回时再传回来 绕了一圈 并不是最好的解决方案 解决办法 sessionStorage或localStorage 本质上最正
  • 深入理解 ES6 Promise

    https segmentfault com a 1190000020934044 引语 最近一段时间在重温ES6 Promise应该是是ES6新特性中非常重要的一部分内容 其实Promise在我日常开发中已经用得比较多 但大多数时候只是知
  • 智能优化算法之粒子群算法(PSO)的实现(Python附源码)

    一 粒子群算法的实现思路 粒子群算法 Particle Swarm Optimization PSO 是于1995年被Kennedy等人提出的一种模拟自然界中鸟群进行觅食过程的一种群智能优化算法 该算法将待求解问题的每一个候选解视作鸟群中的
  • 不得不会的代码注释工具——doxygen

    不得不会的代码注释工具 doxygen 下载 官网下载二进制或者直接用yum或apt工具下载 使用流程 进入项目目录生成doxygen配置文件 doxygen g 修改doxygen配置文件 程序文档输出目录 OUTPUT DIRECTOR
  • 获取List中的数据的实现方法

    大家都知道List是很好的存储数据的集合类 但是获取读取list中数据的方法你知道几种呢 一下是我知道的方法分享给大家 List
  • 黑客帝国全集故事情节解析

    黑客帝国全集故事情节解析 转载自 http www cnitblog com CreatorChen archive 2007 09 27 34083 html 一 前言 从 Matrix I 到 Matrix III 整整四年 一对名叫沃
  • 使用JMeter模拟多IP发送请求(IP欺骗)

    文章目录 一 IP欺骗的使用场景 二 JMeter如何设置IP欺骗 1 获取可用IP 2 配置IP 3 JMeter中配置IP欺骗 三 注意 前言 如果精通LoadRunner 可以直接使用LoadRunner进行IP欺骗 这里介绍如何使用
  • CTF练题(6)棋盘密码解密

    借一道题引出棋盘解密 题目详情如下 题目来自 青少年CTF训练平台 原中学生CTF平台 青少年CTF qsnctf com 题目给予的密文如下 解题 1 使用棋盘密码解码网站进行解密 网站如下 棋盘密码在线加密解密 千千秀字 qqxiuzi
  • 图像分类:Pytorch图像分类之--LetNet模型

    文章目录 前言 LetNet简介 程序的实现 model py的实现 LetNet模型操作流程 经过Conv卷积后输出尺寸的计算公式如下 Conv2d 函数介绍 MaxPool2d 函数介绍 Tensor的展平 view train py
  • oracle 关联加索引,给left join关联关系字段加索引

    给left join关联关系字段加索引 2018 07 04 left join是相当耗资源的操作 如果关联的字段没有索引的话 速度是很慢的 所以如果有left join的话 最好用索引字段取关联 创建索引会消耗大量资源 会导致数据库死锁
  • MySQL 联表查询重复数据并删除(子查询删除记录) SQL优化

    1 业务逻辑及表介绍 数据库表介绍 table a 主表 小表 表数据不可重复 table b 流水表 大表 记录审核流水数据 注 两表表结构大致一致 流水表增加一个审核状态的字段 业务逻辑 主表保存唯一数据 流水表记录审核流水数据 用于后