Xuất phát từ câu hỏi MySQL select 10 random rows from 600K rows fast
Mình tìm được vài điểm bất hợp lý sau:
1. Với accepted answer
SELECT name
FROM random AS r1 JOIN
(SELECT CEIL(RAND() *
(SELECT MAX(id)
FROM random)) AS id)
AS r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 1
===> Các record được chọn sẽ là liên tục, không phải ngẫu nhiên
2. Với cách dùng ORDER BY RAND()
SELECT column FROM table
ORDER BY RAND()
LIMIT 10
===> tốc độ query sẽ chậm (tầm hơn 1s cho 100 records random với table 1 triệu records)
Và dưới đây là solution của mình: dùng UNION + Limit trong mysql kết hợp PHP:
- Chạy vòng for từ 0 -> N
- Với mỗi vòng for, random 1 số a = 0 -> MAX(id) -1
- câu query sẽ có dạng sau:
select column from table where id >= a1
Limit 1
union
select column from table where id >= a2
Limit 1
union
...
select column from table where id >= an
Limit 1
Và tốc độ của câu query trên là 0.4s cho 100 records random với table 1 triệu records
p/s: mình vẫn thấy cách này vẫn chưa tối ưu / tốt lắm. Mọi người ai có cách nào thì thảo luận nhé. Cám ơn mọi người
Lưu ý: điều kiện của bảng là id có thể KHÔNG LIÊN TỤC