sql性能优化

1 关联表查询优化1

可能会遇到这样的工作场景,表A包含待查询的属性,但是有一些额外字段需要通过某个关联字段查询表B,这时候就需要用到join语句,如果表B很大,那么一定要在该关联字段上面建立索引。
举例来说,我有两个表:

内容
t_install用户安装信息,包含user_id,from_where字段,user_id建立了索引
t_pay用户付费信息,包含user_id,money2,money3等字段

现在要将t_pay表中的数据做分类统计,分类就依据用户的from_where字段。
我之前写的sql语句是
select C.fw, sum( C.money ) from ( select A.money as money, coalesce( B.from_where, 'TENCENT' ) as fw from ( select user_id, money2 + money3 as money from t_pay where 0 <= timestamp and timestamp < 1452128224024 and appid = '100632434' ) as A left join ( select user_id, from_where from t_install ) as B on A.user_id = B.user_id ) as C group by C.fw;
先把两个表中需要的字段分别select出来,形成临时表A和临时表B,再进行join,形成表C,可是对于表B来讲,它并没有索引,所以这个查询很慢,大概用5秒时间。
优化后的sql语句是
select A.fw, sum( A.money ) from ( select t_pay.user_id as user_id, ( t_pay.money2 + t_pay.money3 ) as money, coalesce( t_install.from_where, 'TENCENT' ) as fw from t_pay left join t_install using( user_id ) where 0 <= t_pay.timestamp and t_pay.timestamp < 1452128224024 and t_pay.appid = '100632434' ) as A group by A.fw;
这个语句在join的时候直接用了原始表(带索引的t_install),然后再进行条件过滤,这种写法用时不到10毫秒。

参考

[1] http://code.openark.org/blog/mysql/mysql-joins-on-vs-using-vs-theta-style

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值