今天有一位朋友发了这么个场景:一个商店的收入记录表,每天都有记录;
日期 | 每天收入 |
07/11 | 100 |
07/12 | 102 |
07/13 | 103 |
07/14 | 101 |
现在做一个统计,用户希望看到自已的收入统计
日期 | 每天收入 |
07/11 | 100 |
07/12 | 202 |
07/13 | 305 |
07/14 | 406 |
创建表
CREATE TABLE IF NOT EXISTS `income` ( `id` int(11) NOT NULL, `idate` date DEFAULT NULL, `money` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `idate` (`idate`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
查询一,数据量在一千以内,还能接受,但数据量大了以后,查询时间超长。
select a.idate ,sum(b.money) as num from income as a left join income as b on b.idate<=a.idate group by a.idate order by a.idate
expalin 出来的结果
查询二 和单表查询没什么区别,@rowNum 等于查询记录行之前的所有记录的总和
SELECT id, idate, (@rowNum := @rowNum + money) AS total FROM income, ( SELECT (@rowNum := ifnull( (SELECT sum( money ) FROM income WHERE id <=0 ) , 0)))b
ORDER BY id limit 0,30
expain 出来的结果
同样达到一个目标,不同的SQL差距可以是天地之别。
查询一为什么会这么慢,因为他执行了记录数次(1002)SUM 统计,group by 了N次。
查询二只是比普通查询多了个子查询,根据id 查询顺序值越大,越先执行(3211),先执行子查询,将结果置为 drived表