加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MYSQL教程MySQL中实现高性能高并发计数器方案(例如文章点击数)

发布时间:2020-12-12 01:15:36 所属栏目:MySql教程 来源:网络整理
导读:《MYSQL教程MySQL中实现高性能高并发计数器方案(例如文章点击数)》要点: 本文介绍了MYSQL教程MySQL中实现高性能高并发计数器方案(例如文章点击数),希望对您有用。如果有疑问,可以联系我们。 现在有很多的项目,对计数器的实现甚是随意,比如在实现网站

《MYSQL教程MySQL中实现高性能高并发计数器方案(例如文章点击数)》要点:
本文介绍了MYSQL教程MySQL中实现高性能高并发计数器方案(例如文章点击数),希望对您有用。如果有疑问,可以联系我们。

现在有很多的项目,对计数器的实现甚是随意,比如在实现网站文章点击数的时候,是这么设计数据表的,如:”article_id,article_name,article_content,article_author,article_view……在article_view中记录该文章的浏览量.诈一看似乎没有问题.对于小站,比如本博客,就是这么做的,因为小菜的博客难道会涉及并发问题吗?答案显而易见,一天没多少IP,而且以后不会很大.MYSQL入门

言归正传,对文章资讯类为主的项目,在浏览一个页面的时候不但要进行大量的查(查询上文的记录,已经所属分类的名字、热门文章资讯评论、TAG等),还要进行写操作(更新浏览数点击数).把文章的详细内容和计数器放在一张表尽管对开发很方便,但是会造成数据库的压力过大(不然为什么大项目都要分库分表呢).MYSQL入门

那么,分两张表存放就好了么?一张表存文章详细信息,另一张表单独存计数器.MYSQL入门

代码如下:
CREATE TABLE `article_view`(
`article_id` int(11) NOT NULL,
`view` int(11) NOT NULL,
PRIMARY KEY (`article_id`)
)ENGINE=InnoDB;

这种方式,虽然分担了文章表的压力,但是每当有一个进程请求更新的时候,都会产生全局的互斥锁,只能串行,不能并行.在高并发下会有较长的等待时间.MYSQL入门

另一种比较好的办法是对每一个文章的计数器不是一行,而是多行,比如吧,一百行.每次随机更新其中一行,该文章的浏览数就是所有行的和.MYSQL入门

代码如下:
CREATE TABLE `article_view`(
`article_id` int(11) NOT NULL,
`pond` tinyint(4) NOT NULL COMMENT '池子,就是用来随机用的',
PRIMARY KEY (`article_id`,`pond`)
)ENGINE=InnoDB;

小访问量的随机池子100个肯定多了,三五个足矣.每次访问的时候,随机一个数字(1-100)作为pond,如何该pond存在则更新view+1,否则插入,view=1.借助DUPLICATE KEY,不然在程序里是实现得先SELECT,判断一下再INSERT或者UPDATE.MYSQL入门

代码如下:
INSERT INTO `article_view` (`article_id`,`pond`,`view`) VALUES (`123`,RAND()*100,1) ON DUPLICATE KEY UPDATE `view`=`view`+1

获取指定文章的总访问量的时候:MYSQL入门

代码如下:
SELECT SUM(`view`) FROM `article_view` WHERE `article_id`='123'

PS:凡事都是双刃剑.为了更快的读我们通常要牺牲一些东西.在读比较多的表要加快读的速度,在写较多的表要加快写的速度.各自权衡.在加快读的速度的时候,我们牺牲的并不仅仅是写的性能,还有开发成本,开发变的更复杂,维护成本等.所以并不是读的速度越快越好,需要找一个平衡点.MYSQL入门

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读