免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: soichiro
打印 上一主题 下一主题

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

论坛徽章:
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
11 [报告]
发表于 2005-12-12 17:16 |只看该作者
原帖由 rainloftty 于 2005-12-12 17:11 发表
弱弱的说一句,我的msyql查询select count(*) 100多万记录也挺快的.


有1000W count也未必慢,主要看where的条件是什么

论坛徽章:
0
12 [报告]
发表于 2005-12-12 18:58 |只看该作者
我不久前也问了同样的问题,查了mysql手册也没有说可以优化。
我使用的结果是,select count(*)如不带where条件就快,带条件怎么也快不了,我的库1000K条记录,大概300MB,时间大概从几秒到几十秒间,索引也没用。

我现在还没找到好办法,只是跟上面类似,用一个表记录更新count数用于分页,为防止偶尔的出入,设定手动后台完全更新。

论坛徽章:
0
13 [报告]
发表于 2005-12-13 10:59 |只看该作者
原帖由 soichiro 于 2005-12-12 16:58 发表
就是在客户端程序里我是先执行一条INSERT,然后再执行一条UPDATE来修改记录总数,这样如果客户端INSERT以后就中止了,那么UPDATE就没有执行。
那么如果我在客户端程序里用一条语句同时完成INSERT和UPDATE是否就解决了这个问题呢?


那是你还不了解什么是事务,你去了解一下就知道,它就是解决这个问题的。把若干sql查询语句逻辑上合并为一原子操作,就好像只下达一条sql语句一样,结果就是:要么全部成功,只要有一个地方出错就全部回卷,相当于没有发送过指令。
另外,用另外一个表来记录自增id,使用 mysql 的 last_insert_id() 或者 mysql_insert_id(),它们保证在处理客户端并发的时候不会取错数据。

论坛徽章:
0
14 [报告]
发表于 2005-12-14 12:12 |只看该作者
用事务是能很好解决这个问题!

论坛徽章:
0
15 [报告]
发表于 2005-12-14 14:46 |只看该作者
如果那个表有个主键的话,应该是很快的吧?除非你的where条件使用了没有索引的列。

论坛徽章:
0
16 [报告]
发表于 2005-12-15 13:03 |只看该作者

如果是不带where条件进行查询的话,建议创建一个记数表。

如果带where条件的话,可考虑是否创建了合适的索引了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP