1、查询数据在24w
慢sql:由于使用in,导致查询时间漫长,in中的子查询数据太大会严重影响查询效率
SELECT SUM(balance) FROM bill ll where (id,seq_num) in( select user_id,MAX(seq_num) from bill GROUP BY id);
简単优化:执行时间
select sum(u1.balance) from bill u1,(select id,MAX(seq_num) maxn from bill GROUP BY id) u2 where u1.seq_num=u2.maxn and u1.id=u2.id and u1.id!='****'
简单明了的普及下sql查询的执行过程:
第一个被处理的子句总是from,最后执行的是limit,每个操作都会产生一个虚拟表,做为下一步的输入,这个虚拟表对用户是透明的,只有最后一个虚拟表才会返回给用户
(1)from
对和执行笛卡尔积,产生虚拟表VT1
(2)on
对VT1应用on条件过滤,把符合的记录放入VT2
(3)join
如果指定了join类型,如 left join、right join,把相应的外部行添加到VT2,形成VT3
如果from中有两个以上的表,使用VT3和下一个表再执行一遍前3步,直到处理完所有的表
(4)where
对VT3应用where过滤,把符合的记录放入VT4
(5)group by
根据对VT4进行分组操作,产生VT5
(6)cube|rollup
对表VT5进行CUBE或ROLLUP操作,产生表VT6
(7)having
对VT6应用having过滤,符合的记录放入VT7
(8)select
从VT9中挑选出目标列,放入VT8
(9)distinct
对VT8进行去重操作,产生VT9
(10)order by
根据对VT9进行排序,产生VT10
(11)limit
取出指定行的记录,产生VT11,返回给用户