网上看到文章,说是命中率应该用 Qcache_hits/Com_select 
所以我写了如下shell脚本:
#!/bin/sh
qcache_hits=`mysql -u$1 -p$2 -e "show global status like 'Qcache_hits'" | grep Qcache_hits | awk '{print $2}'`
com_select=`mysql -u$1 -p$2 -e "show global status like 'Com_select'" | grep Com_select | awk '{print $2}'`
echo $qcache_hits
echo $com_select
expr $qcache_hits / $com_select但是其结果总是Qcache_hits的值大于Com_select的值.
如:
9188571
4915624
1这样的计算方法对吗?

解决方案 »

  1.   

    像你这样计算命中率,说真的,根据我的了解的看来,挺少用你这种方式的,因为你这种做法,目的是想检查query cache是否设置合理的情况而mysql里,检查query cache是否合理,主要看
    mysql> show status like 'Qcache%';
    这里面你主要参考Qcache hits和Qcache lowmem prunes两项的值
    然后结合
    update和delete这些操作的次数,来综合分析QUERY CACHE是否合理。一般来说,update和delete操作频繁的系统,不适宜将query cache过大,否则,造成query cache管理频繁而影响性能,其中的原理是因为进行update和delete时,会将涉及到对应数据的SQL从query cache里面清理出去的。
      

  2.   

    所以,我觉得你那个参数比较应该意义不大ps:想想还是oracle在这些方面强大,比较容易跟踪性能定位分析得很深入。
      

  3.   


    嗯,确实,系统的update比较频繁!
    按照mysql清理算法,insert会影响query cache里的数据吗? 我的系统insert操作更大!
      

  4.   


    如果按query cache的管理原理,那你的query cache不应该设置太大
      

  5.   

    按照网上的另一篇文章,更改了脚本,如下算的query cache的命中率为%87.#!/bin/sh
    qcache_hits=`mysql -u$1 -p$2 -e "show global status like 'Qcache_inserts'" | grep Qcache_inserts | awk '{print $2}'`
    qcache_inserts=`mysql -u$1 -p$2 -e "show global status like 'Qcache_hits'" | grep Qcache_hits | awk '{print $2}'`
    com_select=`mysql -u$1 -p$2 -e "show global status like 'Com_select'" | grep Com_select | awk '{print $2}'`
    echo Qcache_hits:       $qcache_hits
    echo Qcache_inserts:    $qcache_inserts
    echo Com_select:        $com_select
    echo "scale=2; ($qcache_inserts - $qcache_hits) / $com_select" | bc
      

  6.   

    如果这么说:('Com_select'-'Qcache_inserts')/'Com_select'
    也是可以的哦
      

  7.   

    上边那个脚本应该不对!刚查到比较权威的说法:
    Qcache_inserts : 多少次未命中然后插入的.
    Qcache_hits : 多少次命中的.
    这样计算到我的系统qcache的命中率应该为 %34,这个性能就很差了,应该进行调整。脚本如下:#!/bin/sh
    qcache_hits=`mysql -u$1 -p$2 -e "show global status like 'Qcache_inserts'" | grep Qcache_inserts | awk '{print $2}'`
    qcache_inserts=`mysql -u$1 -p$2 -e "show global status like 'Qcache_hits'" | grep Qcache_hits | awk '{print $2}'`
    echo Qcache_hits:               $qcache_hits
    echo Qcache_inserts:            $qcache_inserts
    hit_rate=`echo "scale=2; $qcache_hits / ($qcache_hits + $qcache_inserts)" | bc`
    echo Query_Cache_Hit_Rate:      $hit_rate
      

  8.   

    这个比例是非常不准确的。
    原因如下:
    Qcache_hits 因为这个一条语句可能被记录N次。
    Com_select 所有查询次数。Qcache_queries_in_cache 表示在CACHE中的语句。
    所有正确的公式:
    Qcache_queries_in_cache/Com_select
      

  9.   

    Qcache_free_blocks 1
    Qcache_free_memory 15719856
    Qcache_hits 0
    Qcache_inserts 0
    Qcache_lowmem_prunes 0
    Qcache_not_cached 18
    Qcache_queries_in_cache 0
    Qcache_total_blocks 1
    ------------
    查一下这些数值,计算一下命中率 Qcache_hits / (Qcache_inserts + Qcache_hits ) * 100%,
    一般这个值低于90%,那么算比较低,然后看下block是不是太少了,如果命中低,且block少
    那么先试图增大Qcache, 再观察观察, 如果数据仍然没什么起色, 也可以关掉, 一般情况不是
    建议关掉, 况且你内在那么大
      

  10.   

    http://blog.csdn.net/qiuyepiaoling/archive/2010/11/12/6004611.aspx
    这个帖子我觉得更加权威一点