时间紧张、不想看太多的话,请直接拉到最后——“快速随机ID方法”
——————————————————————————————————————————————————————
小数据方法
一般来讲,小规模数据集,SQL随机取数很好做
select * from table_name order by rand() limit line_number
大规模数据集——方法1
但是面临大规模数据集的时候(一般超过千万条以上)的时候,中台都很费劲,此时需要使用下面的语句
SELECT * FROM table_name AS t1
JOIN (
SELECT ROUND(
RAND() * ((SELECT MAX(id) FROM table_name)-(SELECT MIN(id) FROM table_name))
+(SELECT MIN(id) FROM table_name)
) AS id
) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT the_number_that_you_want;
注意:
上面的index必须是连续的,否则抽样不均匀。
那么碰到index不连续的呢?
转化思想用起来!愉快地把未知的问题转化为上面的问题。
转化策略
第一种情况:如果没有id。
做一个连续的index出来——转化为连续id问题。
第二种情况:id不连续。
将不连续的id映射到一个连续的index上面;
第三种情况:id是否连续未知。
参考第二种情况处理。
大规模数据集——方法2——快速随机ID方法
按比例
一种 直接在生成ID的时候就随机生成ID 的思路,优于上文的思路。
这种思路是对上文的思路进行了逆转,直接生成随机的id,抽样更均匀了……,还可以自由控制抽样比例。下文举例抽取千分之四,其余的比如23/760等等,可以换算成百分比(3%)、千分比(30千分之)甚至万分比(302万分之),进行实现。
select * from
(select *, trunc( rand(), 4 )*10000 as random from table_name
where provincial_id=10778300 ) as tmp
where random between 1 and 4
按个数
仍然是转化思想,将个数转化为比例即可。比如在总数345678中抽取200条,转化为抽取万分之6即可。