数据库频繁更新的表,而且这个这个表的部分字段频繁读写排序,我这里经常出现死锁,该怎么设计才能避免死锁呢?

2015-04-10 23:14:35 +08:00
 dbfox
这个表是新闻表

[news]
id

viewTimes 总浏览量
viewTimesToday 今日浏览量
viewTimesWeek 本周 浏览量
viewTimesMonth 本月浏览量


这几个浏览量的字段,页面访问一次就会更新一次
更新非常频繁
而且为了提高检索速度 做了排序索引

select top 100 *from news order by viewTimes desc
select top 100 *from news order by viewTimesToday desc
select top 100 *from news order by viewTimesWeek desc


到底该怎么设计呢?

如果把这些统计的信息单独放到另外一张表,虽然不会有过多的死锁情况,但那样在检索文章的时候就没法排序了

这些情况基本上在网站访问量大的情况下产生

不知道大侠们遇到过这样的问题没

有没有什么好的方法?
2771 次点击
所在节点    问与答
10 条回复
knightluffy
2015-04-10 23:30:19 +08:00
因为你这个东西对客户来说要求不是要很精确,你需要自己做一个缓存层,浏览量一段时间update一次到数据库,所有东西都从缓存层去拿。。不要去频繁读写数据库。。
dbfox
2015-04-10 23:34:16 +08:00
@knightluffy
能想到的方法也就是这样了
需要定时的把数据同步到主表中。
这样就增加一点工作量,和维护成本。
jianghu52
2015-04-11 00:16:12 +08:00
如同@knightluffy 所说,内存是个好选择。但是如果你用户再继续多下去,比如像双十一那种数据流量,估计光靠内存都不解决不了。
baskice
2015-04-11 04:38:22 +08:00
思路有这么几种:
1高峰时改为每秒或每分钟更新一次

2高峰时从每个更新改为采样,每十个访客中采样一个等

3改进算法

4硬堆CPU……
kslr
2015-04-11 07:56:13 +08:00
这个值,不要求精确,不要求实时 里面空间很大
humiaozuzu
2015-04-11 08:39:05 +08:00
1. 单独开一个表存这些 counter
2. 丢 redis 存 counter,天生干这个的,key 用 news:123:views:150411 类似格式

top xxx 的结果可以一小时计算一次,更新到 redis 里面
chenjf2k
2015-04-11 09:00:21 +08:00
select top 100 *from news with(nolock) ...
zeayes
2015-04-11 09:52:29 +08:00
新闻内容存数据库,对应的counter用redis的zset存储。
dbfox
2015-04-11 14:19:49 +08:00
@zeayes
@humiaozuzu

在 select 的时候不好搞吧?还有分页都不好搞吧

select top 100* from news where id in( 1,2,3434) order by ??
zeayes
2015-04-11 23:55:54 +08:00
select的时候,把counter组装一下就ok了。

分页为啥不好搞呢?

这个sql没看太懂,既然id都指定了,为啥还要top 100?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/182957

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX