ECDaddy

Menu

MySQl千万数据中高效率随机取数据

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

MySQl数据库获取随机数据的函数rand(),我建议轻易不要用这个,我写博客的时候试了一下,从116万数据里随机获取10条数据,用时26.87s,这个耗费是很惊人的。

SELECT * FROM ecs_host ORDER BY RAND() LIMIT 10

因为MySQl数据的最大值和最小值的获取几乎是0消耗的,数据库表数据与自身主键ID的集合做join查询,是非常快速的。刚我也试了一下,在116万数据的基数下,随机产生10条数据几乎看不到时间消耗的,仅用0.005s。但是这种查询方法有一个缺点,产生的数据ID都是连续的,如果想不连续,用for循环每次随机1条数据即可。

SELECT h1.* FROM ecs_host AS h1 JOIN (SELECT ROUND(RAND()*((SELECT MAX(id) FROM ecs_host)-(SELECT MIN(id) FROM ecs_host))+(SELECT MIN(id) FROM ecs_host)) AS id) AS h2 WHERE h1.id>=h2.id LIMIT 10

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

— 于 共写了768个字
— 文内使用到的标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注