大量 count 的表,需要使用 MyISAM 么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kn007
V2EX    数据库

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

  •  
  •   kn007 2015-02-27 19:08:44 +08:00 1761 次点击
    这是一个创建于 3905 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    请各位指教下,谢谢

    第 1 条附言    2015-02-28 07:55:39 +08:00
    我不知道是我的问题没有描述清楚的原因。
    有几位的回答,都是认为我很白痴,加多个字段存储,或者修改语句达到索引。
    首先我要说的是,我一楼说的也算清楚的了。
    我这个问题基于wordpress或者其他第三框架,添加字段存储,是不现实的,当这些框架更新的时候,你无法避免的需要去修改。
    不过wordpress可以解决这个问题,对wp_count_comments进行add_filter。(我说出来只想告诉你们,我特么试过了,确实可以,但我不想这么做,为什么不,自己去看wp doc)
    我现在就是想尝试下,有没有其他办法解决。至于6楼所谓的看书什么。如果你是来秀优越感的,或者认为我对回答者的谢谢,不够的话。你可以直接说出来,或者不回答。
    我看不懂?请你直接说出原因。我已经在顶楼说的非常明白了,加字段有时不可能,你加了之后,果断时间失效了,有何意义,也就是一些相对完善的框架,如wordpress可以add_filter之类的。
    另外所有的select count 都是 using index了的。如果你只是认为索引不够好的话。你可以提出更优的方案。
    第 2 条附言    2015-02-28 08:23:17 +08:00
    补充一下,我也看了外国朋友如何做。

    只看到使用where可以减少索引导致的Handler_read_next的数量。

    但对于不使用where,是没有办法的。

    根据的需求,可以使用字段存储,他表存储。其他形式存储。

    如果模糊索引,可以利用innodb的自增值,来进行max(ID),不过对于一些场景,如评论,你如果删除评论,mysql减少了一行,但自增值却不会减少,所以不准。

    以上,是我了解到的。

    我其实就是简单想,除了上述办法,有没有其他办法。

    现在使用的版本是5.6.22。

    另外我知道v2不是专门针对某一类的社区,是个大杂烩。

    我也没指望问题一定会被解决之类的,如果没有意义的回帖,请大家都不要浪费时间。谢谢
    第 3 条附言    2015-02-28 11:06:55 +08:00
    补充,本贴正确问题:
    在缺少where字句的情况下,InnoDB对count(*)查询进行优化后,是使用索引的了。但产生了Handler_read_next。如何通过使用触发器和计数器来达成节省Handler_read目的?
    22 条回复    2015-02-28 10:51:38 +08:00
    G2bN4dbX9J3ncp0r
        1
    G2bN4dbX9J3ncp0r  
       2015-02-27 19:19:15 +08:00
    加个字段记录count
    kn007
        2
    kn007  
    OP
       2015-02-27 19:20:14 +08:00
    其他项目可以,但wordpress不现实吧?
    kn007
        3
    kn007  
    OP
       2015-02-27 19:43:11 +08:00
    @lidashuang 已解决了。。读取自增值
    kn007
        4
    kn007  
    OP
       2015-02-27 19:45:20 +08:00
    @lidashuang 但只能模糊查询
    kn007
        5
    kn007  
    OP
       2015-02-27 19:45:47 +08:00
    还是不行
    zhengkai
        6
    zhengkai  
       2015-02-28 01:35:17 +08:00
    COUNT(*) 改成 COUNT(id) 之类的

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

    比如测试 InnoDB 和 MyISAM 用到同样查询的页面的 apachebench 性能会有多少差别。
    kn007
        13
    kn007  
    OP
       2015-02-28 08:59:16 +08:00
    @Livid 谢谢,这个测了一下,是MyISAM比INNODB更多的qps。毕竟select count是直接返回。不过相差其实不算大。。。或许你的意思是说考虑这个(查询)的优化意义并不是很大?
    Livid
        14
    Livid  
    MOD
    PRO
       2015-02-28 09:00:19 +08:00
    @kn007 可能有有效的优化是给页面本身加 memcache。
    est
        15
    est  
       2015-02-28 09:03:49 +08:00
    @kn007 select count(*) 你加个where试试呢?估计就差不多了。
    nine
        16
    nine  
       2015-02-28 09:11:54 +08:00
    innodb 在“排序字段”和 “主键”上加联合索引即可,放心大胆count(*)
    kn007
        17
    kn007  
    OP
       2015-02-28 09:20:53 +08:00
    @est @nine 谢谢两位,或许你们没看完顶楼。。。带Where是会快很多,索引主键和排序字段是没有问题得了。现在已经是using index了,就是会形成Handler_read_next,我在想innodb能不能跟myisam一样,不需要产生任何Handler_read。无论如何,感谢!
    kn007
        18
    kn007  
    OP
       2015-02-28 09:26:25 +08:00
    @Livid 嗯,是的,我现在是给count进行mc存储,使用increment和decrement,倒是不影响。主要是想给别人弄,这家伙呢,又是经常瞎折腾的,经常重新安装wordpress(覆盖安装),就数据库没动。那家伙又有点强迫症,觉得myisam好,select count直接得到值。我是认为用innodb好,不用Optimize。所以我就想能不能解决select count 的问题。嘿嘿。
    性能上实际是没有影响的,就是Handler_read不好看而已。
    Actrace
        19
    Actrace  
       2015-02-28 10:45:34 +08:00   1
    count的最好方法就是在你知道什么元素需要count之前做个计数器。
    withrock
        20
    withrock  
       2015-02-28 10:48:16 +08:00
    我讨厌回答技术性问题用“自己去百度一下/自己去翻书”这样的方式。
    kn007
        21
    kn007  
    OP
       2015-02-28 10:50:50 +08:00
    @Actrace 正有想法,正在了解呢。
    在缺少where字句的情况下,InnoDB对count(*)查询进行优化后,是使用索引的了。但产生了Handler_read_next。
    我正在试图使用触发器和计数器,不过不大熟,嘿嘿
    kn007
        22
    kn007  
    OP
       2015-02-28 10:51:38 +08:00
    @withrock 我觉得如果是这种回答(自己去百度一下/自己去翻书),还不如不答,浪费时间
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5629 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 01:42 PVG 09:42 LAX 17:42 JFK 20:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86