• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Elephant
程序猿
博客园    首页    新随笔    联系   管理    订阅  订阅
mysql实现高效率随机取数据

从数据库中(mysql)随机获取几条数据很简单,但是如果一个表的数据基数很大,比如一千万,从一千万中随机产生10条数据,那就相当慢了,如果同时一百个人访问网站,处理这些个进程,对于一般的服务器来说,肯定是要死机的。

mysql数据库获取随机数据的函数rand(),我建议轻易不要用这个,我写博客的时候试了一下,从16万数据里随机获取5条数据,用时14.02秒,这个耗费满惊人的。

SELECT * FROM t_share ORDER BY rand() LIMIT 5;

通过mysql最大值函数max(),最小值min()来减小查询消耗

因为mysql数据的最大值和最小值的获取几乎是0消耗的,数据库表数据与自身主键ID的集合做join查询,是非常快速的。刚我也试了一下,在16万数据的基数下,随机产生5条数据几乎看不到时间消耗的。但是这种查询方法有一个缺点,产生的数据ID都是连续的,如果想不连续,还要做循环执行才行(每循环一次随机1条或2条数据)。

SELECT sh1.* FROM fw_share AS sh1 
JOIN 
(SELECT 
	ROUND(
		RAND() * ((SELECT MAX(share_id) FROM fw_share)-(SELECT MIN(share_id) FROM fw_share)) 
		+ (SELECT MIN(share_id) FROM fw_share)
	) AS share_id
) AS sh2 
WHERE sh1.share_id>=sh2.share_id

其实随机产生数据,完全可以让他有根据的随机产生。这怎么讲?比如一篇文章,它有标题、标签、内容,可以提取权重很高的关键词,没篇文章都这么处理,用搜索引擎倒排序的方法,可以快速找到相同关键词的一类文章,然后在这些文章里,随机产生几条数据就是了。把大海捞针的活,变成了在浴池里捞个杂物,从大的范围,缩小到能掌控的范围,万事就变得简单啦!这也是一种思路,找不到很好的解决办法时,可以试试。

转自:http://my.oschina.net/sharephper/blog/100104

posted on 2014-06-06 11:57  fanelephant  阅读(16289)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3