问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

MySql计数器如何实现高性能高并发的计数器功能

发布网友 发布时间:2022-04-21 15:40

我来回答

2个回答

懂视网 时间:2022-04-30 09:13

TABLE hit_counter( cnt int unsigned not null ) ENGINE=InnoDB;

  网站的每次点击都会导致对计数器的更新:

UPDATE hit_counter SET cnt = cnt + 1;

  那么问题出现了,对于任何想要更新这一行的事务来说,这条记录上都有全局的互斥锁。这会使得这些事务只能串行执行。要活的跟高的冰法更新性能,我们可以这样解决:

  将技术其保存在多行中,每次随机选择一行进行更新,这样需要对计数器表作如下修改:

CREATE TABLE hit_counter(
 slot tinyint unsigned not null primary key,
 cnt int unsigned not null
) ENGINE = InnoDB;

  然后在这张数据表中增加100条数据。现在选择一个随机的槽(slot)进行更新:

UPDATE hit_counter SET cnt = cnt + 1 where slot = RAND() * 100;

  要获得统计结果,使用具和函数sum()进行查询:

SELECT SUM( cnt ) FROM hit_counter;

  但是还有一种常见的需求是每隔一段时间开始一个新的计数器(如每天一个)。想要实现这个,我们继续修改计数器表啊:

CREATE TABLE daily_hit_counter(
 day date not null,
 slot tinyint unsigned not null,
 cnt int unsigned not null,
 primary( day , slot )  
) ENGINE=InnoDB;

  在这个场景里,可以不用像前面那样,预先生成行,而是用 ON DUPLICATE KEY UPDATE代替:

INSERT INTO daily_hit_counter( day , slot , cnt )
 values( CURRENT_DATE , RAND() * 100 , 1 )
 ON DUPLICATE KEY UPDATE cnt = cnt + 1;

  如果希望减少表的行数,以避免表变得太大,可以写一个周期执行的任务,合并所有结果到0号槽,并且删除所有其他的槽:

UPDATE daily_hit_counter as c
 INNER JION(
 SEKECT day , SUM( cnt ) AS cnt , MIN( slot ) AS mslot
 FROM daily_hit_counter
 GROUP BY day
 ) AS x USING( day )
SET c.cnt = IF( c.slot = x.mslot , x.cnt , 0 ),
 c.slot = IF( c.slot = x.mslot , 0 , c.slot );
DELETE FROM daily_hit_counter WHERE slot <> 0 AND cnt = 0;

 

MySQL计数器表的设计

标签:

热心网友 时间:2022-04-30 06:21

fnServerData": function ( sSource, aoData, fnCallback ) {
/* Add some extra data to the sender */
aoData.push( { "name": "more_data", "value": "my_value" } );
$.getJSON( sSource, aoData, function (json) {
/* Do whatever additional processing you want on the callback, then tell DataTables */
fnCallback(json)
} );
}
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
由人民检察院直接立案侦查的案件范围是怎样的 人民检察院直接立案侦查的条件一般都有哪些 这种功能叫什么名字?就是能在手机屏幕上开个小视频的功能 无时无刻的关心——GYENNOCUP 刚买的红米note手机充电的时候是橘红色的灯 充满了是显示绿色。我的手机... 听说王力宏转入了美国国籍了是吗? 王力宏为什么不入中国国籍?他为何加入美国籍? 全民k歌老是自己重唱上一句怎么事? 全民K歌怎么唱高分 全民K歌唱高分技巧 “因念都城放夜”的出处是哪里 MySQL性能调优 – 你必须了解的15个重要变量 如何选择存储策略? keepalive的实现mysql高可用为什么要设置两个backup 如何在PPT画图并设计为动画 高性能MySQL:字符串类型(1) 如何在幻灯片中添加动画 如何利用lvs实现mysql高可用 mysql数据库的高可用指的是什么 对于实现mysql数据库集群负载均衡和高可使用 哪些措施具有实际意义 通常用什么模型来解决mysql高可用性 怎么实现mysql的高可用 别人分享给我的文件,保存的时候百度云盘老是提示说保存文件数量超过限制,这是为啥?内存空间也还很多 黑桑葚干是什么味道的 桑葚干的简介 经常用桑葚干泡水喝有什么好处?可以长期喝吗? 桑葚干如何制作桑方法 桑葚干泡酒要泡多久 桑葚干可以直接吃吗 桑葚干泡水喝有什么用? 桑葚干的最佳食用方法 lvs实现mysql高可用会导致数据不一致吗 阿里云MySQL云数据库高可用版是什么配置要多少钱 高可用mysql 怎么样 男人想要有家庭地位,需要满足哪几个条件? “mysql”达到1亿级别如何设计优化? 百度网盘转存数量超限怎么办 港股通的股息什么时候到帐 怎么开通港股通? 港股通的开通条件有哪些? 开通港股通的条件是什么? 个人如何开通港股通? 港股的分红是怎么规定的 长期开空调房间没有空气流通对身体会造成什么样的影响大神们帮帮忙 Old Tom the killer whale,的翻译 港股通股票现金红利发放延后的原因? 投资者通过港股通买卖港股通股票的换汇安排是怎样的 如何开通港股通购买港股 什么时候港股通,分红能够到账 何时买入港股通股票可以享受分红? 投资者参与港股通交易需要拥有什么证券账户
  • 焦点

最新推荐

猜你喜欢

热门推荐