随机读取数据库记录的技巧(For MySQL)
时间:2011-04-12
来源:互联网
看过很多大家实现随机读取数据库记录的方法,以及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() 需要算几万几十万几百万个随机数划算的多吧。
抛砖引玉,大家有更好的想法,欢迎一起切磋切磋~~~
如果你的数据库里只有几百条,且调用次数又不多的情况下,你爱用啥方法就用啥方法。
但如果你有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() 需要算几万几十万几百万个随机数划算的多吧。
抛砖引玉,大家有更好的想法,欢迎一起切磋切磋~~~
作者: cu_Cbear 发布时间: 2011-04-12
不错,但一般程序都用不上随机数

作者: stabilization 发布时间: 2011-04-12
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28