mysql随机获取表数据

SELECT t1.* 
FROM geo_road_status t1
JOIN(SELECT ROUND(RAND() * ((SELECT MAX(id) FROM geo_road_status) - (SELECT MIN(id) FROM geo_road_status)) + (SELECT MIN(id) FROM geo_road_status)) id) t2
WHERE 1=1
	AND t1.id >= t2.id
ORDER BY t1.id 
LIMIT 100

从社区扒拉下来的方法,关键计算在于关联当前表中随机自增id,select round(rand() * (max(aa) - min(aa)) + min(aa))

表数据量大的情况下,性能比order by rand()

 

MySQL 中实现随机查询数据的方法有多种,不同的方法适用于不同规模的数据集和性能需求。以下是几种常见的实现方式及其适用场景。 ### 1. 使用 `ORDER BY RAND()` 查询随机记录 这是最简单且直观的方式,适用于小数据量的随机查询。例如,从 `basic_base_info` 中随机获取 50 条记录: ```sql SELECT * FROM `basic_base_info` ORDER BY RAND() LIMIT 50; ``` 此方法通过 `RAND()` 函数为每条记录生成一个随机值,并根据该值进行排序,最后使用 `LIMIT` 获取前 50 条记录。由于需要对全进行排序,因此在大数据量下性能较差[^2]。 ### 2. 基于主键范围的随机查询 为了提高性能,可以利用主键(或唯一标识字段)的范围来生成随机 ID,从而减少扫描行数。例如,从 `t` 中随机获取一条记录: ```sql SELECT MAX(id), MIN(id) INTO @M, @N FROM t; SET @X = FLOOR((@M - @N + 1) * RAND() + @N); SELECT * FROM t WHERE id >= @X LIMIT 1; ``` 该方法首先获取中最大和最小的 ID 值,然后生成一个介于两者之间的随机数作为起始点,最后查找大于等于该值的第一条记录。这种方式减少了全扫描的需求,提高了效率[^3]。 ### 3. 结合子查询与随机 ID 选取多条记录 如果希望获取多条记录,可以通过子查询构造一个随机起始 ID 并结合 `LIMIT` 获取指定数量的记录。例如,从 `news` 中随机获取 10 条记录: ```sql SELECT * FROM `news` AS t1 JOIN ( SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `news`) - (SELECT MIN(id) FROM `news`)) + (SELECT MIN(id) FROM `news`)) AS id ) AS t2 WHERE t1.id >= t2.id LIMIT 10; ``` 这种方法通过构造一个随机 ID 并查找大于等于该 ID 的记录,避免了对整个的排序操作,适用于中
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值