MySql随机查询一条数据

        之前业务里面有一个要求,有一个表存放待解答的问题表,需求是需要随机的展示一个题目到前台页面。

        数据库是使用的MySQL,那么怎么才能随机查询到一条数据呢?

        以下提供三种方式:

        方式一:select * from t order by rand() limit 1;

        方式二:select max(id) as maxId, min(id) as minId from t ; 首先查询出来最大和最小的id,然后再根据这个最大和最小的id,随机生成一个在最大和最小id之间的整数c。然后再根据这个随机c查询数据库:select * from t where id>= c limit 1;

        方式三:select count(*) from t; 首先查询出满足条件的总条数total,然后再根据这个total值生成一个1到total之间的随机数c,根据这个随机数再查询数据库:select * from t  limit c,1;

       如果表的数据量很小,我觉得可以选择第一种,虽然第一种查询在查询数据库时扫描行数相比其它两种,扫描行数最多,但是如果数据量很小的话,这种只需要连接一次数据库,相比另外两种可能还快一些。

      方式二扫描行数和方式三相比,方式二的扫描行数要少一些,但是如果满足结果的id分布不均匀,那么可能随机效果不怎么好,比如id的分布是:1,2,3,30000,....,40000,30000到40000之间是连续的,用方式二查询出来的最大值和最小值是40000,1,那么生成的随机数很可能在3和30000之间,那么查询返回的数据很大可能就是大概率返回id为30000这条,没有达到随机的效果。此时需要选择第三种方案,因为第三种方案返回的是满足条件的数据中,随机的第N条。

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值