查询语句性能问题

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秒内,能不能看出是什么原因,各位帮看一下。
----
实际查询语句已简化和上面一样了还是出同样问题
...全文
106 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
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语句的执行效率

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧