• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

mysql随机查询记录_MySQL

mysql 搞代码 4年前 (2022-01-09) 18次浏览 已收录 0个评论
  1. mysql使用rand随机查询记录效率测试

  2. 一直以为mysql随机查询几条数据,就用

  3. SELECT * FROM `table` ORDER BY RAND() LIMIT 5

  4. 就可以了。

  5. 但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上

  6. 查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。

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

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

  9. SELECT *

  10. FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2

  11. WHERE t1.id >= t2.id

  12. ORDER BY t1.id ASC LIMIT 5;

  13. 但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。

  14. 上面的语句采用的是JOIN,mysql的论坛上有人使用

  15. SELECT *

  16. FROM `table`

  17. WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )

  18. ORDER BY id LIMIT 1;

  19. 我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距。总觉有什么地方不正常。

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

  21. SELECT * FROM `table`

  22. WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))

  23. ORDER BY id LIMIT 1;

  24. 这下,效率又提高了,查询时间只有0.01秒

  25. 最后,再把语句完善一下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。

  26. 完整查询语句是:

  27. SELECT * FROM `table`

  28. WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))

  29. ORDER BY id LIMIT 1;

  30. SELECT *

  31. 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

  32. WHERE t1.id >= t2.id

  33. ORDER BY t1.id L本文来源gaodai$ma#com搞$代*码6网IMIT 1;

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

  35. 前者花费时间 0.147433 秒

  36. 后者花费时间 0.015130 秒

  37. 看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:mysql随机查询记录_MySQL

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址