本帖最后由 xuzuning 于 2012-08-14 11:33:04 编辑

解决方案 »

  1.   

    你对结果集分组试试
    SELECT tid, COUNT( tid ) AS count FROM (SELECT * FROM  `pw_posts` WHERE fid =77) AS ret GROUP BY tid ORDER BY count DESC
      

  2.   

    你这写法更慢呢,子查询查30000多行,然后再对30000多行排序,这不是跑了60000多行么?explain看效率更低
      

  3.   

    ref 已经很好利用了索引了
      

  4.   


    数据情况不一样,我刚才的sql在400万的库里跑的,因为结果集一般小于1k,所以子查询比较快一些
      

  5.   

    如果能化解掉 Using filesort 那就可以了
      

  6.   

    语句本身没有问题,但是设计可以改善你应该先缓存数据
    INSERT INTO `pw_posts_stat`(tid, fid, count)
    SELECT   tid, fid, count(*)   as   count
    FROM   `pw_posts`
    GROUP   BY   tid, fid然后每次查询的时候就会很快了
    SELECT tid, count FROM   `pw_posts_stat`  WHERE   fid=77  ORDER   BY   count   DESC   LIMIT   10 
    SELECT tid, count FROM   `pw_posts_stat`  WHERE   fid=77  ORDER   BY   count   DESC   LIMIT   11, 10SELECT tid, count FROM   `pw_posts_stat`  WHERE   fid=66  ORDER   BY   count   DESC   LIMIT   10 
      

  7.   

    写个脚本 每隔一段时间就把汇总的数据插入到另外一个表A每次都去查询表A即可Mysql比较麻烦要自己写脚本,不像sql.