查询语句性能问题

jontian 技术总监  2015-08-05 05:52:32
select b.user_type from a left join b on a.id=b.id where a.unit_id=1 and a.join_year=2015

b表是a表的子表,a表有40W条,b表有50W条,
因为要查只要a表有的所有数据,所以用from a left join b,
unit_id和join_year在a表都建了索引,如果不加a.join_year=2015条件查询在0.2秒左右,加了这个条件就会到2.3秒,加其它条件也都在0.3秒内,能不能看出是什么原因,各位帮看一下。
----
实际查询语句已简化和上面一样了还是出同样问题
...全文
90 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
jontian 2015-08-06
引用 1 楼 Cherise_huang 的回复:
如果你的select字段包含在索引里面,速度应该会更快一点 并且Where后条件的先后顺序也会影响到SQL语句的执行效率
这个是主业务表,用到的地方很多,已有5个索引了,不合适再建,且我现在的问题是加了join_year这个条件才变慢的。 在所有的条件中只有unit_id这个是排除量最高的,所以放在了第一个条件
回复
jontian 2015-08-06
引用 3 楼 Landa_Ran 的回复:
应该是你的索引创建方式不对,可以看看这个链接http://www.2cto.com/database/201209/156626.html
可能有这个原因,我根据那文章做了些修改,提上去一点,但是还觉得没达到效果,没能达到不加join_year条件的速度。
回复
jontian 2015-08-06
引用 5 楼 Tiger_Zhao 的回复:
a表要把(join_year,unit_id)建在一个索引中,该索引包含(id) 同时建议b表的(id)索引包含(user_type) 还有子表不一定就要 left join,直接 join 就可以,除非你明确需要返回 b.user_type 为 NULL 的记录(有什么意义?)。
你的第一条加上去,没有加快,另外直接用join是默认为inner join吧,这个性能应比left join要差,我这里的业务也是适合用left join
回复
Tiger_Zhao 2015-08-06
a表要把(join_year,unit_id)建在一个索引中,该索引包含(id)
同时建议b表的(id)索引包含(user_type)
还有子表不一定就要 left join,直接 join 就可以,除非你明确需要返回 b.user_type 为 NULL 的记录(有什么意义?)。
回复
xiaoxiangqing 2015-08-06
join_year这个有没有建索引?
回复
Tiger_Zhao 2015-08-06
join_year 字段不是 int 型?
回复
许晨旭 2015-08-05
应该是你的索引创建方式不对,可以看看这个链接http://www.2cto.com/database/201209/156626.html
回复
Landa_Tiny_cui 2015-08-05
可以把A表的筛选后的数据放到临时表里,再用临时表与B表关联
回复
Cherise_huang 2015-08-05
如果你的select字段包含在索引里面,速度应该会更快一点 并且Where后条件的先后顺序也会影响到SQL语句的执行效率
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-08-05 05:52
社区公告
暂无公告