现在有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怎么优化
现在有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怎么优化
1 回答2.4k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
1.4k 阅读
首先,你的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