这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战
前言: 本篇文章 是我关于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;