sql查询 BETWEEN...and...优化

现在有main,sub两个表,关联字段main.sub_id,sub.oid,

sub有个date类型的sub.deal_date可为空的字段,用这个字段按范围查询

select t.* from main t 
left join sub s on t.sub_id = s.oid
where s.deal_date between xxx and xxx

不知道是不是因为deal_date用null导致查询结果特别慢,mian数据总量80多万,sub46万,
请问deal_date怎么优化

阅读 3.3k
1 个回答

首先,你的SQL这么写没问题,只是你的两个表数据量有点多。
建议:1、t.*,不要这种写法,将main 表中的字段全列出来,养成好的习惯。2、给deal_date 字段加个索引。3、你既然这么写:where s.deal_date between xxx and xxx,也就是说你要筛选sub表中满足时间段的数据,那你还不如先筛选(select oid from sub where deal_date between xxx and xxx),再left join.为啥这么写,说一下原因:
1、先执行form,查看这两个表是否存在。
2、执行LEFT JOIN的时候,数据库服务器会将main表和sub表做笛卡尔积,假如main表有10条数据,sub也有10条数据,数据库服务器会生成临时表(temp1)存放10*10=100条数据的表,你的46万*80万是多少?自己算一下,这就很占内存。
3、再执行ON条件,在第2步临时表中根据ON条件计算满足条件的数据,生成temp2。
4、执行where条件,根据索引筛选满足条件的数据。

END

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进