本页二维码,扫一扫分享到朋友圈
朋友圈

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


阅读288 评论0 赞 62返回首页    go 编程与技术  go mysql


测试环境

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 秒,又提供了几倍呀。

 代码如下

复制代码

SELECT *

FROM 表名 AS t1

JOIN (

SELECT ROUND( RAND( ) * (

SELECT MAX( id )

FROM 表名 ) ) AS id

) AS t2

WHERE t1.id >= t2.id

ORDER BY t1.id ASC

LIMIT 10

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

最后还可以优化一下

 代码如下

复制代码

SELECT s_url,title

FROM 表名 AS t1

JOIN (

SELECT ROUND( RAND( ) * (

SELECT MAX( id )

FROM 表名 ) ) AS id

) AS t2

WHERE t1.id >= t2.id and t1.z_type = $z_type ORDER BY t1.id asc LIMIT 10

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

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


  上一篇:go like优化
  下一篇:go mysql的replace函数替换字符串


评论


用QQ登录管理/创建网站 用微博登录管理/创建网站   发布于:12-11