V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kn007
V2EX  ›  数据库

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

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

    比如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就会加上整表的总数。
    虽然速度没有影响,但这样貌似应该会影响性能吧?

    请各位指教下,谢谢

    第 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
    lidashuang
        1
    lidashuang  
       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
       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
       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   ·   实用小工具   ·   1324 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:43 · PVG 01:43 · LAX 09:43 · JFK 12:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.