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

        数据库是使用的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条。

Logo

本社区面向用户介绍CSDN开发云部门内部产品使用和产品迭代功能,产品功能迭代和产品建议更透明和便捷

更多推荐