若 table 有個流水號 id, 且沒有刪過資料, 可以先產生 1 ~ max(id) 之間的數字, 再用 id in (...) 取出隨機的資料。用 Django 的 ORM 來表示大概長這樣:
from django.db.models import Max import random mid = MyTable.objects.aggregate(Max('id'))['id__max'] ids = random.sample(xrange(1, mid + 1), 1000) MyTable.objects.filter(id__in=ids) # 隨機取出 1000 筆資料
若有刪過資料的話, 可能就多取幾筆最後再取前 1000 筆, 或是先取出所有 id 存下來再 sample 吧。
我自己測的結果, 百萬筆的資料用 order_by('?') 要數秒, 但改用 id__in 的寫法則是瞬殺。
沒有留言:
張貼留言