大量 count 的表,需要使用 MyISAM 么?

2015-02-27 19:08:44 +08:00
 kn007

比如wordpress,评论已经上W条,虽说也不多。
但每天
SELECT commentapproved, COUNT( * ) AS total FROM wp_comments GROUP BY comment_approved;
的次数不少。Handler_read_next非常大。
单纯通过改语句我觉得意义不大,毕竟wp更新后可能就会失效。
myisam在count是完全没有任何handle_read
*的产生。
而innodb每count一次,Handler_read_next就会加上整表的总数。
虽然速度没有影响,但这样貌似应该会影响性能吧?

请各位指教下,谢谢

1450 次点击
所在节点    数据库
22 条回复
lidashuang
2015-02-27 19:19:15 +08:00
加个字段记录count
kn007
2015-02-27 19:20:14 +08:00
其他项目可以,但wordpress不现实吧?
kn007
2015-02-27 19:43:11 +08:00
@lidashuang 已解决了。。读取自增值
kn007
2015-02-27 19:45:20 +08:00
@lidashuang 但只能模糊查询
kn007
2015-02-27 19:45:47 +08:00
还是不行
zhengkai
2015-02-28 01:35:17 +08:00
COUNT(*) 改成 COUNT(id) 之类的

话说不是学习过程中每一个问题都要带到论坛上来问,你学习不是为了给别人看的。找本《高性能MySQL》看看,然后自己多做做试验吧
zhengkai
2015-02-28 01:37:36 +08:00
我第一行的回答是对 1 楼的解释,1 楼已经给你答案了但是你看不懂,你另外一个问题我也回答了,但是你也是看不懂,我本来想解释,但是发现要解释的内容太多,你还是多自己看看吧。话说你的这些问题完全可以自己设计一组测试来给自己解答
SoloCompany
2015-02-28 02:42:52 +08:00
如果不需要比如外键和存储过程之类的所谓高级特性,MyISAM 最大的问题仅仅是所有数据访问都要锁表,好像类似于 wordpress 这种系统没有太大影响吧,如果能用 MyISAM 解决问题,建议还是直接用 MyISAM 来解决,因为简单
kn007
2015-02-28 07:19:59 +08:00
@zhengkai 。。。已经是Using index了,伙计。我只注意handle_read,两者相同。我试了下,两者一样。我试过了的,好吧
至于你说的,没错。不过如果不是没有头绪,我也不会问。
kn007
2015-02-28 07:21:24 +08:00
@zhengkai 我在顶楼已经说的非常清楚了。单纯通过修改语句、或者增加个存储字段,对wordpress意义不大。我并不是单纯给自己使用,给别人用呢?如果对方wordpress自动更新后呢?
kn007
2015-02-28 07:21:31 +08:00
@SoloCompany 好的,谢谢
Livid
2015-02-28 08:55:45 +08:00
能快多少,或者会慢多少,最好的方法是自己实际做对比测试。

比如测试 InnoDB 和 MyISAM 用到同样查询的页面的 apachebench 性能会有多少差别。
kn007
2015-02-28 08:59:16 +08:00
@Livid 谢谢,这个测了一下,是MyISAM比INNODB更多的qps。毕竟select count是直接返回。不过相差其实不算大。。。或许你的意思是说考虑这个(查询)的优化意义并不是很大?
Livid
2015-02-28 09:00:19 +08:00
@kn007 可能有有效的优化是给页面本身加 memcache。
est
2015-02-28 09:03:49 +08:00
@kn007 select count(*) 你加个where试试呢?估计就差不多了。
nine
2015-02-28 09:11:54 +08:00
innodb 在“排序字段”和 “主键”上加联合索引即可,放心大胆count(*)
kn007
2015-02-28 09:20:53 +08:00
@est @nine 谢谢两位,或许你们没看完顶楼。。。带Where是会快很多,索引主键和排序字段是没有问题得了。现在已经是using index了,就是会形成Handler_read_next,我在想innodb能不能跟myisam一样,不需要产生任何Handler_read。无论如何,感谢!
kn007
2015-02-28 09:26:25 +08:00
@Livid 嗯,是的,我现在是给count进行mc存储,使用increment和decrement,倒是不影响。主要是想给别人弄,这家伙呢,又是经常瞎折腾的,经常重新安装wordpress(覆盖安装),就数据库没动。那家伙又有点强迫症,觉得myisam好,select count直接得到值。我是认为用innodb好,不用Optimize。所以我就想能不能解决select count 的问题。嘿嘿。
性能上实际是没有影响的,就是Handler_read不好看而已。
Actrace
2015-02-28 10:45:34 +08:00
count的最好方法就是在你知道什么元素需要count之前做个计数器。
withrock
2015-02-28 10:48:16 +08:00
我讨厌回答技术性问题用“自己去百度一下/自己去翻书”这样的方式。

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

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

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

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

© 2021 V2EX