sql not in与left join百万级数据测试比较

两张表 组织架构表(Organise) 和 工资发放历史记录表 (WagePerMonthHis)

两张表通过 Organise.Item_id 和 WagePerMonthHis.OrgIdS 进行关联

Organise表(以下简称O表)中大约有6000条记录11个字段 ,WagePerMonthHis(以下简称W表)计有 125万条记录 和 25个字段

 

原程序中一段如下的语句

是查询所有不在W表的组织架构层级为2的记录

 代码如下 复制代码

select OrgId as 公司编码,OrgName as 公司名称

from Organise

where OrgLev=2

and item_id not in

(select OrgidS from WagesPerMonthHis

where WagesYear='2010' and WagesMonth=

'01' Group by OrgidS,OrgNameS)

order by Orgid

 

语句执行要33秒之久,服务器的配置是比较高的:16核心4CPU,24G内存,且内存和CPU在执行时都没有出现瓶颈,开始以为是

 代码如下 复制代码

(select OrgidS from WagesPerMonthHis

where WagesYear='2010' and WagesMonth=

'01' Group by OrgidS,OrgNameS)  

 这条语句执行缓慢所致,单独执行这条却发现执行速度很快,大约不到2秒就出来了,于是症结出来了,是not in 这个全扫描关键词带来的性能下降.最直接的是导致页面失去响应,一个关键功能使用不了.

 

试了not exist语句,发现效果是一样的,并不象网上所说可以提高很多性能.

 

于是重新优化语句如下

 代码如下 复制代码

select a.OrgId as 公司编码,a.OrgName as 公司名称,a.item_id

from Organise a

left outer join (select distinct b.OrgIdS from WagesPerMonthHis b

where WagesYear='2010' and WagesMonth='01') as b

on a.item_id = b.OrgidS

where a.OrgLev = 2

and b.OrgIdS is Null

order by 公司编码

 

改用左外连接(其实左连接也可以)后,整个语句执行速度为400ms, 33秒与400ms 我想是很多人没想到的.

 

时间: 2024-11-01 12:21:57

sql not in与left join百万级数据测试比较的相关文章

SQL数据库优化大总结之百万级数据库优化方案_MsSql

网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. (1) 选择最有效率的表名顺序(只在基于规则的seo/' target='_blank'>优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交

SQL数据库优化大总结之百万级数据库优化方案

网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. (1) 选择最有效率的表名顺序(只在基于规则的seo/' target='_blank'>优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交

总结:如何使用redis缓存加索引处理数据库百万级并发

前言:事先说明:在实际应用中这种做法设计需要各位读者自己设计,本文只提供一种思想.准备工作:安装后本地数redis服务器,使用mysql数据库,事先插入1000万条数据,可以参考我之前的文章插入数据,这里不再细说.我大概的做法是这样的,编码使用多线程访问我的数据库,在访问数据库前先访问redis缓存没有的话在去查询数据库,需要注意的是redis最大连接数最好设置为300,不然会出现很多报错. 贴一下代码吧 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1

MySQL 百万级分页优化(Mysql千万级快速分页)_Mysql

以下分享一点我的经验 一般刚开始学SQL的时候,会这样写 复制代码 代码如下: SELECT * FROM table ORDER BY id LIMIT 1000, 10; 但在数据达到百万级的时候,这样写会慢死 复制代码 代码如下: SELECT * FROM table ORDER BY id LIMIT 1000000, 10; 也许耗费几十秒 网上很多优化的方法是这样的 复制代码 代码如下: SELECT * FROM table WHERE id >= (SELECT id FROM

一分钟了解阿里云产品:性能测试通过SLB保持百万级TCP连接C1M

一直以来,对SLB的转发性能到底如何比较好奇.于是,最近开了一个测试用的SLB来玩玩C1M,即我们能不能通过一个SLB来保持1百万个TCP长连接?     我的测试配置如下:   1个内网SLB,端口配置8000->8001, TCP按最小连接数转发. 3个后端server ECS,配置4核4G ram. 17个client ECS,配置1核2G ram. server是一个简单的echo service, client每秒向SLB发起500个TCP连接请求,建连后每隔20秒向server发送一

百万级应用是怎样炼成的:基于产品与推广

自从乔帮主推出APP Store 构建起一个可循环的生态系统后,移动互联网行业开始火热起来,继而蔓延到中国,甚至影响到整个互联网的发展趋势.可以这么说,APP Store出现的那年是移动互联网的元年.这两年,移动互联网成为互联网行业最热的词语,不管你是个人开发者.初创企业还是互联网巨头,都以各种方式开发 出移动互联网产品,寻找新的蓝海.而在上周,业内朋友推荐我看了极客公园<百万级应用是怎样炼成的>的视频,颇受感染,深受启发,同时结合业内前辈的经验 与自己的经历写下此文,希望正在观看的你能有所获

百万级PHP网站架构工具箱

在了解过世界最大的PHP站点,Facebook的后台技术后,今天我们来了解一个百万级PHP站点的网站架构:Poppen.de.Poppen.de是德国的一个社交网站,相对Facebook.Flickr来说是一个很小的网站,但它有一个很好的架构,融合了很多技术,如 Nigix.MySql.CouchDB.Erlang.Memcached.RabbitMQ.PHP.Graphite.Red5以及Tsung. Poppen.de目前有200万注册用户数.2万并发用户数.每天20万条私有消息.每天25万

【重磅】新智元推出百万级AI智库资讯互动平台,AI World2017世界人工智能大会TOP10大奖榜单发布

2017年11月8日,由新智元主办的 AI World 2017 世界人工智能大会在北京国家会议中心隆重启幕,国内外上百位AI领袖作了覆盖技术.学术和产业最前沿的报告和讨论.超过2000名 AI 精英共襄盛会.海淀区副区长李长萍.中国人工智能产业发展联盟副秘书长何宝宏为大会致辞.会上,新智元创始人兼CEO杨静与助理来也CTO胡一川发布了全球首个AI专家互动资讯平台"新智元V享圈",基于此打造百万级AI产业生态平台. AI World 2017 世界人工智能大会 "AI奥斯卡&

抵御百万级在线用户强压,服务器性能测试就该这么做!

导读    大量用户登录游戏产生的"洪荒之力"往往会对游戏服务器产生巨大的压力,游戏上线之前对服务器的承载能力做测试是必须要做的事.本文从腾讯游戏服务器性能测试的经历出发,对服务器性能测试的原理.指标和方法进行了介绍,并介绍了内部目前流行的一些工具和使用技巧.   在四年磨一剑的奥运会,要想成功,必须顶住压力,在0.13秒错失400米自由泳金牌之后,孙杨在200米自由泳比赛中后来居上,夺回冠军:傅园慧靠着自己的"洪荒之力",反复刷新自己的最好成绩.     那么,同