MySQL实现随机查询

方法一:
SELECT * FROM table ORDER BY RAND() LIMIT 1;
评价:不建议使用,效率非常低,官方文档中进行说明:Order By和RAND()连用,会多次扫描表,导致速度变慢。

方法二:
SELECT * FROM table
    WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM table)))
    ORDER BY id LIMIT 1;
思路:先查询出table中的id的最大值,然后再获取一个小于此值的随机数,然后将满足条件的行都选出来,取第一个;
评价:有问题。如果id不是从0开始的话,比如从10000开始自增,那么SELECT floor (RAND() * (SELECT MAX(id) FROM table)) 将会很大概率得到小于10000的值,经过WHERE限定的查询结果将会是所有的查询结果的几率变大,最后LIMIT 1获取的是第一行数据的几率变高。

方法三:
SELECT * FROM table
    WHERE id >= (SELECT floor (RAND() * ((SELECT MAX(id) FROM table) - (SELECT MIN(id) FROM table)) + (SELECT MIN(id) FROM table)))
    ORDER BY id LIMIT 1;
方法四:
SELECT *
FROM table AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM table) - (SELECT MIN(id) FROM table)) + (SELECT MIN(id) FROM table)) AS id ) AS t2
    WHERE t1.id >= t2.id
    ORDER BY t1.id LIMIT 1;
评价:解决了方法二中MAX(id)的问题,可以获取MAX(id)和MIN(id)中的随机数。

原文地址:https://www.cnblogs.com/yuanfei1110111/p/10260521.html

时间: 2024-10-11 06:58:39

MySQL实现随机查询的相关文章

MYSQL的随机查询的实现方法

SELECT *FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2WHERE t1.id >= t2.idORDER BY t1.id LIMIT 1; MYSQL的随机抽取实现方法.举个例子,要从tablename表中随机提取一条记录,大家一般

MySQL使用rand 随机查询记录效率测试

以下的文章主要介绍的是MySQL使用rand 随机查询记录效率测试,我们大家一直都以为MySQL数据库随机查询的几条数据,就用以下的东东,其实其实际效率是十分低的,以下就是文章的主要内容. SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了.但是真正测试一下才发现这样效率非常低.一个15万余条的库,查询5条数据,居然要8秒以上 查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低. You cannot use

mysql随机查询记录的高效率方法

mysql使用rand随机查询记录的高效率方法 一直以为mysql随机查询几条数据,就用 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了. 但是真正测试一下才发现这样效率非常低.一个15万余条的库,查询5条数据,居然要8秒以上 查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低. You cannot use a column with RAND() values in an ORDER BY clause

如何实现MySQL随机查询数据与MySQL随机更新数据?

以下的文章主要介绍的是MySQL随机选取数据,对实现MySQ随机查询数据与MySQ随机更新数据的实际操作步骤的描述,以及对其实际操作中所要用到的语句的描述,以下就是对其具体操作步骤的描述. MySQL随机查询数据 以前在群里讨论过这个问题,比较的有意思.mysql的语法真好玩.他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询.翻了手册,找到了下面这个语句,可以完成任务了. SELECT * FROM table_name ORDER BY rand() LIMIT 5; MySQ

mysql 随机查询 效率比较

select primary_count as primaryCount, primary_score as primaryScore, junior_count as juniorCount, junior_score as juniorScore, senior_count as seniorCount, senoir_score as senoirScore, total_score as totalScore, pass_score as passScore from pd_paper

mysql随机查询符合条件的几条记录

随机查询,方法可以有很多种.比如,查询出所有记录,然后随机从列表中取n条记录.使用程序便可实现.可是程序实现必须查询出所有符合条件的记录(至少是所有符合条件的记录id),然后再随机取出n个id,查询数据库.但是效率毕竟没有数据库中直接查询得快.下面介绍mysql中怎样随机查询n条记录. 1.最简单的办法order by rand(),示例 select * from question q where q.`level`=1 order by rand() limit 1; 此写法,可以将查询出的

创建角色随机名字(mysql抽取随机记录)和mysql游标的使用

最近在开发中遇到了一些问题,在此记录一下解决的方法,已作备忘. 1.现在创建游戏角色的时候,基本上都是支持角色名字随机的,以前此功能在客户端用代码实现,然后向服务器请求并验证,后来发现有时候连续几次都失败,所以改成在服务器实现.实现方法主要考虑使用mysql随机查询记录,在网上查了很多方案,然后用在了我们游戏中. 实现方案是,将所有随机名字都插入到一张表中,然后从中随机取一条当前角色表中没有出现过的名字. BEGIN DECLARE randnum int DEFAULT 0; SELECT F

MySQL 中随机获取数据

由于需要大概研究了一下MYSQL的随机抽取实现方法. 目前采用的方法: SELECT * FROM tablename ORDER BY RAND() LIMIT 1 实现原理: 通过ORDER BY RAND()来打乱数据的排序,LIMIT 来限制获取数据的条数. 缺点: 效率低.在进行大数据量检索时,会增加检索时间.一个15万余条的库,查询5条数据,居然要8秒以上. 官方手册说明,rand()放在ORDER BY 子句中会被执行多次,自然效率很低.

python3 mysql 多表查询

python3 mysql 多表查询 一.准备表 创建二张表: company.employee company.department #建表 create table department( id int, name varchar(20) ); create table employee( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male'