mysql替换in效率_seo专家 怎么代替mysql的in函数优化速度

怎么代替mysql的in函数优化速度

e66fc000cef15fdeae5b2fbcbb57b855.png

你这到union all,or 和in 及字段的,,,,

1、对引列来使用union all复杂的查询含运算等】将使or、in放弃索引而全表扫描,除非你能确定or、in会使用索引。

2、对于只有非索引字段来说你就老老实实的用or 或者in,因为 非索引字段本来要全表扫描而union all 只成倍增加表扫描的次数。

3、对于及有索引字段【索引字段有效】又包含非索引字段来时,按理你也使用or 、in或者union all 都可以,但是我推荐使用or、in。

上面都说的是单表的情况,所以你这个问题你给出语句信息,

并不能简单的说谁比in快的,,,,要看索引字段情况的

MYSQL NOT IN优化

501ff2b54a85fa122195279420eb2c5e.png

算法上存在很大问题。我们先析该算法的执行次数。

按照你的方法,record表中的id字段要全部查询一遍,也就是2W次查询,而每次查询,最坏

情况下需要与offline_record中的rec.id进行4W次比较,这又导致offline_record表的4W次

查询(取rec_id )。假设满足

a.* from record a where a.id not in(select b.rec_id from offline_record);

条件的记录一共有N条,那么,最坏情况下,该算法所做的查询次数为:

2W(取record.id)+2W*4W(每取一次record.id就要取一次offline_record.rec_id且offline_record的最后一条数据满足条件)+N(每

条满足条件的记录需要再在record中取该记录全部数据)

所做的比较次数为:

2W*4w

考虑最好情况下的效率,该算法所做的查询次数为:

2W(取record.id)+2W*1(每取一次record.id就要取一次offline_record.rec_id且offline_record的第一条数据满足条件)+N(N(每

条满足条件的记录需要再在record中取该记录全部数据)

所做的比较次数为:

2W*1

因此,该算法平均查询次数为:

2W+(4w*2w+1)*2w/2+N ->8*10^12

天文数字!这还不考虑将近4亿次的平均比较次数,所以你的执行效率当然低了

下面,我们对该算法来进行优化:

算法主要解决的问题是,取表record中id不等于offline_record.rec_id的数据。现假定id为record的主键(你的问题没有指明,但是你会看到无论id是否主键都不影响分析),设计算法如下:

1、取offline_record.rec_id的结果为集合,并对该集合进行排序,设最终生成的集合为A 。则,查询数据库4w次,生成集合的算法按照O(N*ln N)的效率来算平均情况下比较O(4W*ln 4w),约等于64W次,排序次数按照O(N*ln N)的效率来算平均情况下比较O(4W*ln 4w),约等于64W次。

2、顺序取record中的id与第一步生成的集合A进行比较,从而得出最终结果。该过程中由于record.id与A均为有序表,所以比较次数为2w次,查询次数为2w+N次。

如上算法,查询次数为 4W+2W+N=6W+N次,平均比较次数为 64W+64W+2W=130w次。

显而易见,该算法对原算法进行了最大的优化,大概将速度提高了10*8倍。

考虑到对数据库的查询时间远远大于排序比较时间,改进厚的算法在实际操作中还会有更好的表现。

至于你对mysql查询语句的优化,则是治标不治本之举,虽然有用,但毕竟是微小量变,不足与影响全局,在一个坏的算法下,几乎不能提升性能。

mysql where in(几千个ID)如何优化

831aea7f0bcf7ca824e169dd8174e607.png

你是指这种吗?update表1aseta.字段='test'whereexists(select1from表2bwherea.字段1=b.字段1)将查询的条件都放在exists里面

相关标签推荐:

延展阅读:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值