夢想妖夏

浅谈mysql语句的优化之group by和rand()

2014-11-26

博主是个天真的数据库使用者
写的sql语句从来不管效率
直到昨天在群里装X,摆弄自己的图库,
点了下翻页,然后反应巨慢,3秒后才反应。因为昨天太晚,而且自我感觉应该是网络抽了,所以没去理
今天跑去debug,发现是sql语句运行耗时3秒多
博主的这句翻页使用了随机背景,当然必须使用产生的随机数据的语句
句子是[]里面的group by是为了防止取出相同的图片,因为从api得到的插入目录有部分图片会重复

select title,preview,image from img_db group by preview order by rand() desc limit 0,10

以前图库量不大,运行时间很小没去在意
(╯—﹏—)╯如今图库已经快一年,数据量在3.2W+

然后执行这语句,耗时是3.0s到4.5s不等

经过搜索,网上解释,rand()效率极低,而且group by在未设置索引字段也比distinct 慢很多,于是改进语句,感谢互联网各位大神的分享

SELECT distinct preview,title,image FROM img_db  WHERE id >= ((SELECT MAX(id) FROM img_db)-(SELECT MIN(id) FROM img_db)) * RAND() + (SELECT MIN(id) FROM img_db)  LIMIT 10

本语句耗时查询花费 0.0008 秒

当然还有个使用Join的更加快

SELECT * FROM 'table' AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM 'table')-(SELECT MIN(id) FROM 'table'))+(SELECT MIN(id) FROM 'table')) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id LIMIT 1;
	

效率嘛我就不多说了,记下这个

标签:

Related Posts

27 Comments

  1. 尤其是空间不行的,会窘机的

    2014.11.29 at 11:59
    #1  
    • 效率是最重要的

      2014.11.29 at 12:43
      #11
      • 唉,追求效率的时代。。还是js方便

        2014.11.29 at 21:31
        #12
        • 啥?js是javascript。java的臃肿是路人皆知啊

          2014.11.30 at 08:11
          #13
          • 嘿嘿,不用服务器执行,我最喜欢了

            2014.11.30 at 13:47
            #14
          • Java 和 JavaScript 完全没关系…

            2014.12.8 at 12:09
            #14
            • 不过我听有些人说JS的效率也不是很高,对不对呢

              2014.12.8 at 12:42
              #15
              • 那肯定, 比较是单线程, 特效来说一般够了. 不过 V8 引擎的效率很高, 如果你想要再高, 可以用 那个 啥 JS的… 直接对底层的操作,.

                2014.12.8 at 17:07
                #16
  2. 临时手动更新缓存

    2014.12.2 at 20:59
    #2  
  3. 菊苣有空么?能帮我弄个评论模板么?

    2014.12.3 at 13:50
    #3  
    • 菊苣不敢当,评论模板?啥来的

      2014.12.3 at 15:58
      #31
      • 我在给我的wordpress主题弄一个comments.php模板,最后差个评论发布按钮的样式没完成,捣鼓2天了

        2014.12.3 at 16:40
        #32
      • 终于弄好了,太感谢菊苣了

        2014.12.5 at 09:33
        #32
  4. 发现是sql语句运行耗时3秒多

    2014.12.3 at 16:25
    #4  
  5. 还有子查询分页方式√

    2014.12.8 at 12:08
    #5  
    • 我以前学过oracle的语法,可惜基本上忘记了

      2014.12.8 at 12:42
      #51
  6. 主要不能保证每个ID都存在.. 乃这样的话

    2014.12.8 at 12:09
    #6  
  7. 站长你好,恒创科技买主机送平板,独立IP专享7折,诚邀广告位合作,博主有兴趣可加Q:2954243953

    2014.12.15 at 16:42
    #7  
    • 我也想啊,但是没米啊,不好意思

      2014.12.15 at 17:33
      #71
  8. 鸡蛋我来看你了

    2014.12.21 at 11:05
    #8  
  9. 不错的站点,以后一定常来。

    2015.10.11 at 15:02
    #9  
  10. 这个好算不错的啊
    吉他谱http://www.02942.cn/ 吉他指法入门

    2016.04.23 at 15:13
    #10  
  11. 哈哈 这个还算不错啊
    传奇私服 http://bbs.caipiaodian.com.cn 热血传奇私服sf

    2016.04.24 at 14:58
    #11