1,以前用mysql不多,不过写sql时都会考虑效率,主要是考虑先尽量筛选主表的数据。
而今天写了个sql,从几十万条数据中做累计,还要和其他表结合获得用户信息,为了简洁写成如下形式
select c.name,sum(a.cnt) from a,b,c
where a.id=b.uid
and a.id=c.id
group by a.id
order by a.id
从程序上看没有任何的问题,a和c是1:1,a和b是1:n
结果几十万条数据要6秒左右。
而和一个和他类似的更大的sql,执行居然要30秒。
于是考虑建立索引,但是并没有很大的改观。
后来改为如下方法,速度就发生了质的变化,不到1秒即完成。
select c.name,a.cnt from (
select a.id,sum(a.cnt) cnt
from a,b
where
acc.id = b.uid
group by a.id) a,
c
where
a.id = c.id
order by a.id
2,另外就是concat和substring的效率
有个关系是A表的id要和B表的sid结合。id的形式是1,2,3,而sid的数据形式是s1,s2,s3。
开始是使用order by a.id
concat('s',id)=sid,要6秒执行完成。
而转成id=substring(sid,2)可以缩减到3秒完成。