大数据sql语句查询优化

一个文章表,字段有 id,title,content,uid,category_id,update_time

文章有400多万条,如何随机20条uid=5并且category_id=1的文章。

sellect id,title,update_time from article where uid=5 and category_id=1 ORDER BY RAND() LIMIT 20

这样查询的话,好像效率低,时间长。有好办法吗?

阅读 2.2k
3 个回答

参考:http://jan.kneschke.de/projec...

选一行可以用:

SELECT name
  FROM random AS r1 JOIN
       (SELECT (RAND() *
                     (SELECT MAX(id)
                        FROM random)) AS id)
        AS r2
 WHERE r1.id >= r2.id
 ORDER BY r1.id ASC
 LIMIT 1;

基本思想是,先生成 id ,然后直接用 id 选择行。

选多行的话,可以执行多次。

文章里有关于不连续 id (会导致概率不均匀),与一次选取多行的讨论。

新手上路,请多包涵

一条一条随机,比一口气随机效率高

鉴于大数据使用order by rand() 来获取随机数的话,这个效率确实非常低效的。需要把所有纪录都放到一个临时表,然后给一个随机索引,再返回所需要的行数,来了一个全表扫描。
楼上都给出了一些SQL方案,我这里给一个带程序相关的:

可以使用程序先随机生成10个id纪录,从max(id),min(id)中间生成
mt_rand($min, $max)
然后再 select * from article where id in(1,3,5,...)

通过程序控制随机数。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题