時間緊張、不想看太多的話,請直接拉到最後——「快速隨機id方法」
一般來講,小規模資料集,sql隨機取數很好做
select
*from table_name order
by rand(
)limit line_number
但是面臨大規模資料集的時候(一般超過千萬條以上)的時候,中颱都很費勁,此時需要使用下面的語句
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的時候就隨機生成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
1and
4
仍然是轉化思想,將個數轉化為比例即可。比如在總數345678中抽取200條,轉化為抽取萬分之6即可。 SQL 隨機抽樣的總結
對於 sql 隨機抽樣我們常想到的就是 newid 但如果對於乙個在百萬 千萬甚至更大海量資料表中抽樣的話,簡單的 newid 其效能,效率就不是很理想了。所以在這裡有必要討論一下,擇優而用。long goods 是乙個百萬資料的表,ctrl l 執行以下語句 id index 是我為主鍵加的乙個非...
mR 隨機抽樣
1.問題由來 google曾經有一道非常經典的面試題 給你乙個長度為n的鍊錶。n很大,但你不知道n有多大。你的任務是從這n個元素中隨機取出k個元素。你只能遍歷這個鍊錶一次。你的演算法必須保證取出的元素恰好有k個,且它們是完全隨機的 出現概率均等 這道題的解法非常多,網上討論也非常熱烈。本文要討論的是...
MySQL隨機抽樣
最近由於需要大概研究了一下mysql的隨機抽取實現方法。舉個例子,要從tablename表中隨機提取一條記錄,大家一般的寫法就是 select from tablename order by rand limit 1。但是,後來我查了一下mysql的官方手冊,裡面針對rand 的提示大概意思就是,在...