很多系统都会报表统计模块,对于数据量小的系统来说,写个sql语句加个索引就可以解决。但数据量庞大、操作频繁的表,这么整肯定会有问题的。那么,如何做报表设计,这边提供一个比较老套通用的思路。
一.新增一个统计表,与业务部分开。
为啥弄个统计表,大家一想就知道。数据较庞大(千万),我们过多去统计数量或者其他,肯定会影响很吃性能,如果用的人很多那就更不用说了。加索引也没法避免count查询,有的统计根据年统计,然后到全公司或者部门,count数量大,也是很慢的。
例如:这个是客户的跟进记录表,数量22741748条,在数据库没有其他查询的情况下,查询全公司一年的跟进count数,约0.7秒。
CREATE TABLE `crm_follow` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`user_id` int(11) DEFAULT NULL COMMENT '跟进人,默认为自己',
`customer_id` bigint(20) DEFAULT NULL COMMENT '客户的联系人ID',
`topic_id` bigint(20) DEFAULT NULL COMMENT '主题ID',
`type` int(11) DEFAULT NULL COMMENT '跟进方式:1.去电 2.来电 3.email 4.IM 5.上门拜访',
`status` int(5) DEFAULT NULL COMMENT '跟进状态,从字典获取',
`next_flow_time` datetime DEFAULT NULL COMMENT '下次跟进时间',
`flow_count` int(11) DEFAULT NULL COMMENT '当前跟进次数(第几次跟进)',
`ec_date` datetime DEFAULT NULL COMMENT '预计成交日期',
`is_assist` tinyint(1) DEFAULT NULL COMMENT '0:否,1:是,是否协助',
`assister` int(11) DEFAULT NULL COMMENT '协助人',
`content` varchar(500) DEFAULT NULL COMMENT '跟进细项',
`remarks` varchar(200) DEFAULT NULL COMMENT '备注',
`create_user` varchar(50) DEFAULT NULL COMMENT '创建人',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`modify_user` varchar(50) DEFAULT NULL COMMENT '修改人',
`modify_time` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
KEY `user_id` (`user_id`),
KEY `customer_id` (`customer_id`),
KEY `next_flow_time` (`next_flow_time`),
KEY `assister` (`assister`),
KEY `create_time` (`create_time`)
) ENGINE=InnoDB AUTO_INCREMENT=107874820 DEFAULT CHARSET=utf8 COMMENT='记录客户根据信息';
这个库还是我一个人使用的情况下,而且还是统计一年的、单一业务,如果五年内的查出来,拿岂不是很慢?
二.定时统计,每天凌晨统计昨天的数据,将业务表里面的数据记录到统计表里。
当然统计表,只做统计,业务新增的数据用定时处理,无需时时更新。因为业务表新增/删除数据,统计表也新增/删除&#x