免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4055 | 回复: 15
打印 上一主题 下一主题

[数据库优化]请教:有没有办法可以避免使用COUNT以改善性能? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-11 19:47 |只看该作者 |倒序浏览
我用一个表来储存用户数据,用户每次从客户端查询的时候都必须告诉用户他个人共有多少条记录,现在我是用COUNT来做的:

  1. SELECT COUNT(id) FROM table WHERE uid = 'user_id'
复制代码


问题是在表中记录增长以后性能恶化非常严重,现在记录已经接近100万条,查看MySQL状态发现随时都有无数个Locked,都是上面这条查询,现在数据库服务器CPU占用随时都在90%以上(双路Xeon 3G, Linux kernel 2.6.14, MySQL 5)。
原来我用的方法是专门用一个表来储存用户个人的总记录数,这样就不会有性能问题,但会由于客户端的异常中止而造成统计数字与实际记录不符(例如记录写入后程序异常中止,没有写入记录数统计+1)。

请问有没有什么好的办法能够解决这个问题?谢谢!

[ 本帖最后由 yejr 于 2005-12-12 13:42 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2005-12-12 10:23 |只看该作者
原帖由 soichiro 于 2005-12-11 19:47 发表
但会由于客户端的异常中止而造成统计数字与实际记录不符(例如记录写入后程序异常中止,没有写入记录数统计+1)。


用支持事务的数据表类型来做,比如InnoDB。

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2005-12-12 10:34 |只看该作者
原帖由 soichiro 于 2005-12-11 19:47 发表
我用一个表来储存用户数据,用户每次从客户端查询的时候都必须告诉用户他个人共有多少条记录,现在我是用COUNT来做的:

  1. SELECT COUNT(id) FROM table WHERE uid = 'user_id'
复制代码


问题是在表中记录增 ...


应该在用户每次更新记录的时候,有个数据库有字段为此+1,
这个数值不应该是count出来的

论坛徽章:
0
4 [报告]
发表于 2005-12-12 13:32 |只看该作者
数据库优化下,我这里和你差不多112W条数据,你这样的查询,我需要0.05S,就完成了。不知道你的情况如何?

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2005-12-12 13:50 |只看该作者
楼上的,别总是喜欢吹牛

具体查询时间,要看表中的记录实际信息的情况,

这比你那1000个并发连接可能吹的更狠!

论坛徽章:
0
6 [报告]
发表于 2005-12-12 14:58 |只看该作者
to:北京野狼
事实如此.我只是做了个最简单的实验而已。当然,每个人的database 是不一样的,我只是拿自己库的做实验。
不想和你理论,stop!

论坛徽章:
0
7 [报告]
发表于 2005-12-12 16:58 |只看该作者
原帖由 rardge 于 2005-12-12 10:23 发表


用支持事务的数据表类型来做,比如InnoDB。



感谢你的建议,我会考虑试试InnoDB,但我刚才想了一下,我用单独的表来保存用户记录总数的时候好像犯了一个错误,就是在客户端程序里我是先执行一条INSERT,然后再执行一条UPDATE来修改记录总数,这样如果客户端INSERT以后就中止了,那么UPDATE就没有执行。
那么如果我在客户端程序里用一条语句同时完成INSERT和UPDATE是否就解决了这个问题呢?

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2005-12-12 17:01 |只看该作者
  1. 这样如果客户端INSERT以后就中止了,那么UPDATE就没有执行。
复制代码


???????????????????????????

论坛徽章:
0
9 [报告]
发表于 2005-12-12 17:04 |只看该作者
原帖由 hardiwang 于 2005-12-12 13:32 发表
数据库优化下,我这里和你差不多112W条数据,你这样的查询,我需要0.05S,就完成了。不知道你的情况如何?


我有90W条数据,负载不高的情况下0.00 sec就执行完了,但负载高的时候就很慢,用show processlist一看全是Locked.

论坛徽章:
0
10 [报告]
发表于 2005-12-12 17:11 |只看该作者
弱弱的说一句,我的msyql查询select count(*) 100多万记录也挺快的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP