用户名:
密 码: 记住
您当前的位置:首页 > 网络编程 > mysql教程

sql order by rand随机数据优化与性能对比

时间:2015-01-23  来源:西部数据  作者:西部数据

今天要做网站文章右则随机推荐功能,这个我们需要根据当前分类中随机调用不同文章出来,下面我来给大家分享我在使用order by rand取随机数据优化.

测试环境:apache2.2/php5.2/mysql5

测试数据:15W+数据,数据表大小600MB

测试语句:最初使用的是 order by rand()了,发现几万条数据居然要10秒之长的时间很是悲剧吧,代码如下:

SELECT * FROM `表名`  order by rand()

显示行 0 - 29,154,825 总计, 查询花费 10.1125 秒,后来网上搜索到如下方法,同样数据感觉有很大的提高了,这里测试的是15W数据,代码如下:

SELECT * FROM 表名 WHERE id >= ((SELECT MAX(id) FROM 表名)-(SELECT MIN(id) FROM 表名)) *

RAND() + (SELECT MIN(id) FROM 表名) LIMIT 10

显示行 0 - 29 (154,825 总计, 查询花费 0.0221 秒),感觉不错了,有朋友说用join可能更好,于时找了一段代码测试一下查询花费 0.0025 秒,又提供了几倍呀,代码如下:

  1. SELECT * 
  2. FROM 表名 AS t1 
  3. JOIN ( 
  4. SELECT ROUND( RAND( ) * ( 
  5. SELECT MAX( id ) 
  6. FROM 表名 ) ) AS id 
  7. AS t2 
  8. WHERE t1.id >= t2.id 
  9. ORDER BY t1.id ASC 
  10. LIMIT 10 

显示行 0 - 9 (10 总计, 查询花费 0.0025 秒),最后还可以优化一下,代码如下:

  1. SELECT s_url,title 
  2. FROM 表名 AS t1 
  3. JOIN ( 
  4. SELECT ROUND( RAND( ) * ( 
  5. SELECT MAX( id ) 
  6. FROM 表名 ) ) AS id 
  7. AS t2 
  8. WHERE t1.id >= t2.id and t1.z_type = $z_type ORDER BY t1.id asc LIMIT 10  //phpfensi.com 

显示行 0 - 9 (10 总计,查询花费 0.0008 秒).

总结一下,我们如果用同样的方法在字段选择时越少越好,这不从0.0025直接降到0.0008秒了.

来顶一下
返回首页
返回首页
推荐资讯
WiFi太不安全:7岁女孩11分钟内入侵公共网络 WiFi太不安全:7岁女孩11分钟内入侵近期刚刚发布研究说WiFi网络能获得人们手机里多少私人信息,
不服跑个分?人工智能也出现“刷分”乱象 不服跑个分?人工智能也出现“刷分2014年,人工智能领域突然爆发,成为了科研和科技创业的热门
相关文章
    无相关信息
栏目更新
栏目热门