问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

MYSQL NOT IN优化

发布网友 发布时间:2022-04-10 14:25

我来回答

4个回答

热心网友 时间:2022-04-10 15:55

算法上存在很大问题。我们先来分析该算法的执行次数。
按照你的方法,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查询语句的优化,则是治标不治本之举,虽然有用,但毕竟是微小量变,不足与影响全局,在一个坏的算法下,几乎不能提升性能。

热心网友 时间:2022-04-10 17:13

将两个表的已建立的索引删除,重新建立索引,然后执行以下语句
select * from record a where not exists(select 1 from offline_record where rec_id=a.id)

热心网友 时间:2022-04-10 18:47

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

热心网友 时间:2022-04-10 20:39

如果可以的话,应该只查询你需要的字段。这样你的数据量会大大减小
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
cad里面打完字怎么还原十字架 财务建帐需要什么 建账建账的基本要求 当爱情与亲情需要丢弃一样时,你会选择丢弃哪一方 当爱情和亲情有冲突时你会怎样决择?你会为你所爱的人不顾一切吗? 剑网三 查看余额 因为某些特殊原因不好登陆游戏查看,求其他方式_百度知 ... 右肺上叶中叶结节灶怎么回事 节能门窗有哪些标准 节能门窗有哪些 节能门窗具有哪些特征 井字,旁边画个石头,代表什么生肖 背井离乡是什么生肖 远处一井两花伴,猜十二生肖中的一个,并说明为什么? “#”这个符号代表什么生肖? 脑筋急转弯井字猜一个生肖 生锈的铁锅炒菜 生锈的锅可以炒菜吗? 美团退款退到微信账户,如何查询款项 美团外卖订单后用微信支付的,但是单子取消了,钱哪里去了,怎么找回来? iOS掌上道聚城怎么完成别人的心愿墙?求有图的步骤!谢谢 人过世烧香有什么讲究 给死人上香上几根?有啥忌讳?上一根会不会被骂? 歌华有线股票属什么板块 股票歌华有线2007年7月走势图 给过世的人烧几柱香火? 求助操盘高手,600037歌华有线因业绩快报下跌,如何操作? 股票:现在买歌华有线怎么样? 灵堂上香:亲人去世,在家设灵堂,该上几根香 600037歌华有线被深套,后市如何操作? 歌华有线这只股票怎么样?星期一还会涨吗? 一斤干香菇泡发后得多少斤? 干香菇的泡法 干香菇泡发后的出成率怎么算 用玉筋鱼酱汁是什么 韩剧主君的太阳 这句话的意思,详解一下谢谢 韩国金鱼汁是什么东西 建行的信用卡如何开卡? vivo手机屏幕摔坏了又要多少钱? 建行的信用卡开卡怎么弄? 建行信用卡如何开卡?必须是本人麼?要身份证麼? vivo,手机屏幕多少钱? 中国建设银行信用卡申请资料忘记了怎么激活 最近脚底突然就脱皮了,主要在脚趾和脚底板之间 这是怎么回事 怎么看 hadoop 中哪个任务占用的资源大 怎样用 filesystem java api 来实现查看文件系统空间总量 就相当于linux命令: hadoop fs -du 的操作 喂养泰迪的注意事项有哪些? 养泰迪犬有什么注意事项? 泰迪幼犬喂养注意事项?有哪些? 泰迪幼犬喂养注意事项 iphone6国行a1586/a1524/a1589/a1593区别有哪些?