sql随机抽取数据50条_使⽤MySQL从20万条数据中通过筛选
随机取出1条数据的⽅法...
mysql删除重复的数据保留一条
因为业务需要,要求在⼀个where筛选完的数据集中随机取出1条数据。
经典的⽅法
SELECT * FROM table where 条件 ORDER BY RAND() limit 1;
适⽤⼊门级应⽤,怎么这样说呢?
因为数据量⼩时,倒没多⼤问题,由于会进⾏全表扫描,当数据量渐渐巨型时,查询时间会相当变态。
本地环境运⾏需时在0.276s左右。
百度出来别⼈验证过,性能⾼效的⽅法是
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 WHERE t1.id >= t2.id
ORDER BY t1.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 WHERE t1.id >= t2.id and 条件1 and 条件2 and 条件3
ORDER BY t1.id LIMIT 1;
⽣产虚拟数据 先⽣成20万条虚拟数据,要随机⽣成,保证数据的均匀分布。
我们下⾯就来测试⼀下 ⽣产虚拟数据
跑⼀下 平均只⽤0.006s左右
跑⼀下
统计符合条件的数⽬
SELECT COUNT(*) FROM `table` WHERE 条件1 and 条件2 and 条件3;
符合条件的数据有8340条,占⽐0.0417。
数据校验 运⾏8000次 校验通过:0.999875, 检验不通过:0.000125 计算了⼀下,是1条。
数据校验
运⾏了两次程序,结果依旧,原因暂未查明。
数据重复性测试
由此来看,随机性还是挺不错的,多数数据是出现在前段,这个⽅法可以使⽤。
注意:在max,min⾥⾯的语句不能再加⼊where,加⼊后发现查询明显减慢,经EXPLAIN分析是会导致⼀条或多条select_type为SUBQUERY进⾏全表扫描。
原⽂链接

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。