随机读取数据库记录的技巧(For MySQL)

发布于 2022-10-15 10:18:51 字数 1043 浏览 49 评论 0

看过很多大家实现随机读取数据库记录的方法,以及Google了一下相关的文件,发现大家几乎清一色使用 order by rand() 来达到该目的,但是实际上存在非常严重的性能问题。
如果你的数据库里只有几百条,且调用次数又不多的情况下,你爱用啥方法就用啥方法。
但如果你有10万或100万或更多条数据的话,那么每次执行带 order by rand() 的 SQL 语句的时候,MySQL服务器需要计算出10万或100万或更多个随机数,可想而知对数据库服务器的资源浪费有多大。

我建议大家使用以下方法之一:

第一种:count + limit
    1、SELECT COUNT(*) FROM table_name // 获取到数据库总记录 $count
    2、$randoffset = rand(0, $count-1);
    3、SELECT * FROM table_name LIMIT $randoffset,1

第二种:maxid
    1、SELECT MAX(id) FROM table_name // 获取数据库主键字段的最大值 $maxid
    2、$randid = rand(0, $maxid);
    3、SELECT * FROM table_name WHERE id>=$randid limit 1
    如果能确保id是连续的,甚至可以直接算出一组 $randid,然后用 WHERE id IN ($randid_1, $randid_2, ...),批量提取数据
    如果id不是连续的,可以使用多算一些随机数,然后 WHERE id IN ($randid_1, $randid_2, ... $randid_100) LIMIT 10,虽然我为了提取10条记录计算了100个随机数,但总比用 order by rand() 需要算几万几十万几百万个随机数划算的多吧。

抛砖引玉,大家有更好的想法,欢迎一起切磋切磋~~~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

握住我的手 2022-10-22 10:18:51

不错,但一般程序都用不上随机数

时光与爱终年不遇 2022-10-22 10:18:51

楼主在什么应用下使用随机读取数据库记录?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文