หลังจากเห็นคำตอบมากมายฉันตัดสินใจที่จะเปรียบเทียบพวกเขาทั้งหมดในฐานข้อมูล PostgreSQL (9.6.3) ของฉัน ฉันใช้ตารางขนาดเล็กกว่า 100,000 ตารางและกำจัด Model.order ("RANDOM ()") ครั้งแรกเนื่องจากมันมีขนาดสองคำสั่งช้ากว่า
การใช้ตารางที่มี 2,500,000 รายการที่มี 10 คอลัมน์มือที่ชนะเลิศคือวิธีถอนออกเร็วกว่านักวิ่งเกือบ 8 เท่า (ชดเชยฉันวิ่งแค่นี้บนเซิร์ฟเวอร์ในพื้นที่เพื่อให้ตัวเลขนั้นอาจสูงเกินจริง วิธีการคือสิ่งที่ฉันจะใช้ท้ายที่สุดนอกจากนี้ยังเป็นที่น่าสังเกตว่านี่อาจทำให้เกิดปัญหาคือคุณถอนมากกว่า 1 ผลในแต่ละครั้งเนื่องจากแต่ละอันจะไม่ซ้ำกันหรือที่สุ่มน้อย
Pluck ชนะการทำงาน 100 ครั้งในตารางแถวที่ 25,000,000 ของฉัน Edit: จริง ๆ แล้วเวลานี้รวมถึงการถอนในวงถ้าฉันเอามันออกมามันจะวิ่งเร็วเท่าการทำซ้ำง่าย ๆ บน id อย่างไรก็ตาม; ใช้ RAM ในปริมาณที่พอสมควร
RandomModel user system total real
Model.find_by(id: i) 0.050000 0.010000 0.060000 ( 0.059878)
Model.offset(rand(offset)) 0.030000 0.000000 0.030000 ( 55.282410)
Model.find(ids.sample) 6.450000 0.050000 6.500000 ( 7.902458)
นี่คือข้อมูลกำลังทำงาน 2,000 ครั้งในตารางแถวละ 100,000 แถวของฉันเพื่อแยกแยะแบบสุ่ม
RandomModel user system total real
find_by:iterate 0.010000 0.000000 0.010000 ( 0.006973)
offset 0.000000 0.000000 0.000000 ( 0.132614)
"RANDOM()" 0.000000 0.000000 0.000000 ( 24.645371)
pluck 0.110000 0.020000 0.130000 ( 0.175932)