zoukankan      html  css  js  c++  java
  • ORDER BY RAND()


    大概是因为需要研究了一下MYSQL随机样本实现。例如:离tablename表随机抽取了创纪录,我们一般的写法是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。

    可是,在MYSQL的官方手冊。里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,由于这样会导致数据列被多次扫描。可是在MYSQL 3.23版本号中。仍然能够通过ORDER BY RAND()来实现随机。

    可是真正測试一下才发现这样效率非常低。一个15万余条的库,查询5条数据。竟然要8秒以上。查看官方手冊,也说rand()放在ORDER BY 子句中会被运行多次,自然效率及非常低。

    You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.

    搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。

    SELECT * FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
    WHERE t1.id >= t2.id
    ORDER BY t1.id ASC LIMIT 5;

    可是这样会产生连续的5条记录。

    解决的方法仅仅能是每次查询一条。查询5次。即便如此也值得。由于15万条的表。查询仅仅须要0.01秒不到。

    以下的语句採用的是JOIN,mysql的论坛上有人使用

    SELECT *
    FROM `table`
    WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
    ORDER BY id LIMIT 1;

    我測试了一下。须要0.5秒,速度也不错,可是跟上面的语句还是有非常大差距。

    总觉有什么地方不正常。

    于是我把语句改写了一下。

    SELECT * FROM `table`
    WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
    ORDER BY id LIMIT 1;

    这下。效率又提高了,查询时间仅仅有0.01秒

    最后。再把语句完好一下。加上MIN(id)的推断。

    我在最開始測试的时候。就是由于没有加上MIN(id)的推断,结果有一半的时间总是查询到表中的前面几行。

    完整查询语句是:

    SELECT * FROM `table`
    WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))
    ORDER BY id LIMIT 1;

    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;

    最后在php中对这两个语句进行分别查询10次,

    前者花费时间 0.147433 秒

    后者花费时间 0.015130 秒

    意见采纳JOIN不是直接的语法WHERE在使用功能甚至更高的效率非常

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    intellij idea
    this.getClass().getResource(String) 路径问题
    org.hibernate.AssertionFailure: null id 错误
    Hibernate 映射
    关于idea 在创建maven 骨架较慢问题解决
    常用base.css
    form表单样式
    ul li自适应居中导航
    table-cell实现未知宽高图片,文本水平垂直居中在div
    多行文字水平垂直居中在div
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4878275.html
Copyright © 2011-2022 走看看