Mysql 计数器表和汇总表

411 阅读2分钟

这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战

猫和老鼠.jpg

前言:   本篇文章 是我关于MySQL的第29篇文章,水平一般、能力有限。文章写的比较浅,适合新手来看。之前被问到一个面试题,MySQL中一般怎么来优化性能。当时只是把一些比较常见的说了一下。其实还有一些可能用到了但是没有想到优化方法。

在数据库设计表时,有些表中的数据需要实时展示到页面上,但是重复的去统计这些数据是费事费力的。这个时候我们可以有下面这几种方式来实现。

汇总表

每隔一段时间,将这段时间内的数据生成一张汇总表。每次查询不会再去直接统计数据,而是查询这张表。 这样性能会有很大的提升,在有一定量脏数据的前提下加快了查询速度。

例如: 某小程序需要统计每12个小时内登录用户总数。 正常查询:如果正常查询的话,每次查询的结果大概率是都不相同的。每分钟每秒都会有变化。 汇总表:设定定时任务,每个小时统计一次结果写入到一张表中。每次查询会固定去查询这张表。 优点是:速度会快,用户体验比较好。 缺点是:登录用户总数是不准确的,是有时间差的数据。

CREATE TABLE login_collect (
  login_num int NOT NULL
) ENGINE=innodb ;

update login_count set login_num= (select * from login_info where update_time>DATE_ADD(now(),INTERVAL -12 HOUR) );

计数器表

顾名思义就是在每次操作之后将记录写入到这张表里。每次直接查询这条数据,这样速度也是快的。

还是上面的例子: 某小程序需要统计每12个小时内登录用户总数。

CREATE TABLE login_collect (
  login_num int NOT NULL
) ENGINE=innodb ;

-- 在每个用户登录时,增加1 
update login_count set login_num=login_num+1;

这样虽然是实时的,但是表更新时会阻塞查询。这样反而不利用查询的速度。

我们可以在这个表中新增多行,每行的计数器都初始化为0,查询时查询总和。

CREATE TABLE login_collect (
  login_num int NOT NULL,
  `id` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=innodb ;

-- 在每个用户登录时,增加1 
update login_count set login_num=login_num+1 where id = ROW()*1000;

-- 查询语句
select sum(login_num) from login_collect;