返回顶部
首页 > 资讯 > 数据库 >mysql如何关联更新删除不走索引优化
  • 708
分享到

mysql如何关联更新删除不走索引优化

2024-04-02 19:04:59 708人浏览 薄情痞子
摘要

这篇文章给大家分享的是有关Mysql如何关联更新删除不走索引优化的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。关于update in不走索引的:首先select子查询形

这篇文章给大家分享的是有关Mysql如何关联更新删除不走索引优化的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

关于update in不走索引的:

首先select子查询形式是走索引的如下所示:

select * from  acct_trans_payment  where  autopayflag='N' and objectno in(

select serialno from acct_loan where businessstatus='1' and accountinGorgid='10080201')

执行计划如下:

mysql如何关联更新删除不走索引优化

然后select连接的形式:

select * from  acct_trans_payment a,acct_loan b   where a.objectno=b.serialno  and a.autopayflag='N' and b.businessstatus='1' and b.accountingorgid='10080201';

mysql如何关联更新删除不走索引优化执行计划如下:

至此可以看出来,select 的in子查询的形式优化器发生了内部转换,转换成了join链接的形式,提高的性能!

然而update的却没有自动转换成join链接的形式,如下所示:

update acct_trans_payment set autopayflag='Y'  where autopayflag='N' and objectno in(

select serialno from acct_loan where businessstatus='1' and accountingorgid='10080201')

mysql如何关联更新删除不走索引优化

下文中有解释执行计划中的select_type中的dependent subquery的检索过程。

所以手动改写成join形式:

update acct_trans_payment a,acct_loan b set a.autopayflag='Y'  where a.objectno=b.serialno  and a.autopayflag='N' and b.businessstatus='1' and b.accountingorgid='10080201'

mysql如何关联更新删除不走索引优化

效率提高了。。。。

关于delete的优化过程:

delete from cfs.acct_trans_payment   where serialno in(

select serialno from jd.jd_flow where repaymentstype='05'

);

mysql如何关联更新删除不走索引优化

首先我们来解释一下图中的dependent subquery是什么意思:手册上的解释是,子查询中的 jd.jd_flow表的select,取决于外面的查询。就这么一句话,其实它表达的意思是:子查询中的查询方式依赖于外部(cfs.acct_payment_log)的查询。换句话说就是jd.jd_flow表的检索方式依赖于cfs.acct_payment_log表的数据,如这里 cfs.acct_payment_log表得到的记录serialno (where serialno  in)刚好可以被 jd.jd_flow表作为unique_subquery方式来获得它的相应的记录;换种写法如果此时cfs.acct_payment_log表扫描第一条记录得到的serialno为10001的话,那么后面子查询的语句就类似于这样的语句:

select serialno from jd.jd_flow where repaymentstype='05' and serialno='10001'。此时这个语句就会被优化拿来优化,变成了上面的子查询的执行计划,由于jd.jd_flow的主键是serialno,所以会走主键索引。

通过这个解释我们可以知道:全表扫描cfs.acct_payment_log表,将cfs.acct_payment_log的每条记录传递给jd.jd_flow表,jd.jd_flow表通过主键索引方式来获得记录判断自身的条件,则找到一个满足此查询的语句。

总结:当看到 select_type为dependent subquery的时候,就说明外表走的全表,然后把where value in  中的外表中的每个value值给子查询表,然后遍历结果!

当子查询结果比较小的时候可以先把子查询查出来,然后写成如下形式:

select *  from cfs.acct_trans_payment  where serialno in(

'101071256426871193705',

'101184648601257984005',

'101366238550600089605',

'101506423110987776005',

'101699991116782796905',

'101872867624796569705',

'99235027109713920005')

对应的执行计划:

mysql如何关联更新删除不走索引优化

那么当子查询结果集比较大的时候,改怎么优化呢?

一样借助连接的形式

delete  a from   cfs.acct_trans_payment a join  jd.jd_flow b  where a.serialno =b.serialno  and b.repaymentstype='05'

等价于

delete from cfs.acct_trans_payment   where serialno in(

select serialno from jd.jd_flow where repaymentstype='05'

);

如下是两个的执行计划,显然性能提升了不少!

mysql如何关联更新删除不走索引优化

又如:

delete  a ,b from   cfs.acct_trans_payment a join  jd.jd_flow b  where a.serialno =b.serialno  and b.repaymentstype='05'

等价于

delete from cfs.acct_trans_payment   where serialno in(

select serialno from jd.jd_flow where repaymentstype='05'

);

同时

delete from jd.jd_flow where repaymentstype='05'  and serialno in (select serialno  from 

cfs.acct_trans_payment)

也就是说会把两个表的符合条件的都删除。。。。。

题外话:关于delete的join形式:

delete from left join

DELETE A FROM YSHA A LEFT JOIN YSHB B ON A.code=b.code WHERE b.code is NULL;

等同于

DELETE FROM YSHA WHERE NOT EXISTS(SELECT 1 FROM YSHB B WHERE YSHA.code=b.code );

注意delete的时候不允许起别名,如下会报错!!!!

delete from cfs.acct_trans_payment  a  where EXISTS ( select serialno from jd.jd_flow b where b.repaymentstype='05' and a.serialno=b.serialno );

ERROR 1064 (42000): You have an error in your sql syntax; check the manual that corresponds to your MySQL Server version for the right syntax to use near 'a  where EXISTS ( select serialno from jd.jd_flow b where b.repaymentstype='05' ' at line 1

可以需要这样:

delete from cfs.acct_trans_payment     where EXISTS ( select serialno from jd.jd_flow b where b.repaymentstype='05' and cfs.acct_trans_payment.serialno=b.serialno )

感谢各位的阅读!关于“mysql如何关联更新删除不走索引优化”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

您可能感兴趣的文档:

--结束END--

本文标题: mysql如何关联更新删除不走索引优化

本文链接: https://lsjlt.com/news/62616.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • mysql如何关联更新删除不走索引优化
    这篇文章给大家分享的是有关mysql如何关联更新删除不走索引优化的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。关于update in不走索引的:首先select子查询形...
    99+
    2024-04-02
  • mysql中如何进行联合索引优化
    今天就跟大家聊聊有关mysql中如何进行联合索引优化,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  exp...
    99+
    2024-04-02
  • MySQL如何更新、删除
    这篇文章主要为大家展示了“MySQL如何更新、删除”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL如何更新、删除”这篇文章吧。一、更新UPDATE 表名 SE...
    99+
    2023-06-29
  • MySQL 5.5如何删除索引
    这篇文章主要为大家展示了“MySQL 5.5如何删除索引”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL 5.5如何删除索引”这篇文章吧。 ...
    99+
    2024-04-02
  • mysql如何删除index索引
    小编给大家分享一下mysql如何删除index索引,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! m...
    99+
    2024-04-02
  • mysql如何删除主索引
    在mysql中删除主索引的方法:1.命令行启动mysql服务;2.登录mysql;3.进入数据库;4.执行命令删除主索引;在mysql中删除主索引的方法首先,在命令行中启动mysql服务;service mysql start  MySQL...
    99+
    2024-04-02
  • mysql中如何删除索引
    这篇文章主要介绍了mysql中如何删除索引,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、根据索引名删除普通索引、唯一索引、全文索引。alter table&nb...
    99+
    2023-06-15
  • MySQL如何优化索引
    1.  MySQL如何使用索引 索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行。表越大,花费越多。如果表中有相关列的索引,MySQL可以快速确定要在...
    99+
    2022-05-27
    MySQL 索引 MySQL 优化索引
  • Mysql索引如何优化
    小编给大家分享一下Mysql索引如何优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!编程沉思录     &...
    99+
    2024-04-02
  • MySQL如何删除多表关联
    这篇文章主要介绍MySQL如何删除多表关联,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 在MySQL中,删除关联的多张表,可以使用下面SQLmysql&...
    99+
    2024-04-02
  • mysql如何删除唯一索引
    这篇文章主要讲解了“mysql如何删除唯一索引”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql如何删除唯一索引”吧! 删...
    99+
    2024-04-02
  • MySQL中如何优化索引
    MySQL中如何优化索引,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。文章的脑图如下:索引优化规则1、like语句的前导模糊查询不能使用索...
    99+
    2024-04-02
  • mysql关联查询如何优化
    小编给大家分享一下mysql关联查询如何优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! mysq...
    99+
    2024-04-02
  • MySQL索引如何进行优化
    这篇文章主要介绍了MySQL索引如何进行优化,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  创建 test 测试表  CREATE TAB...
    99+
    2024-04-02
  • MySQL中的索引如何优化
    这篇文章主要介绍了MySQL中的索引如何优化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL中的索引如何优化文章都会有所收获,下面我们一起来看看吧。使用索引优化索引是数...
    99+
    2023-03-01
    mysql
  • 数据库中走索引删除0条记录却要142秒的优化案例
    这篇文章主要为大家展示了“数据库中走索引删除0条记录却要142秒的优化案例”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“数据库中走索引删除0条记录却要142秒的...
    99+
    2024-04-02
  • mysql中索引配置如何优化
    这篇文章将为大家详细讲解有关mysql中索引配置如何优化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 2     索引及查询优...
    99+
    2024-04-02
  • MySQL如何基于Explain关键字优化索引功能
      explain显示了MySQL如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。简单讲,它的作用就是分析查询性能。   explain关键字的使用方法很简单,就...
    99+
    2022-05-12
    MySQL Explain关键字 索引
  • 如何使用不同的索引更新解决MySQL死锁
    这篇文章给大家分享的是有关如何使用不同的索引更新解决MySQL死锁的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。示例如下CREATE TABLE `t3`&n...
    99+
    2024-04-02
  • Mysql 索引该如何设计与优化
    什么是索引? 数据库索引是一种数据结构,它以额外的写入和存储空间为代价来提高数据库表上数据检索操作的速度。通俗来说,索引类似于书的目录,根据其中记录的页码可以快速找到所需的内容。——维基百科 常见索引有哪些? ...
    99+
    2022-05-28
    MySQL 索引设计 MySQL 索引优化
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作