问题:使用mysql如何随机获取一条数据
解决:使用mysql自带的rand()方法
方法:
测试数据为4204641条数据,四百二十万记录(已经进行了数据表分表、并增加了user_id索引)
select count(1) from views;
受影响行数: 0 已找到记录: 1 警告: 0 持续时间 1 查询: 5.438 sec.
方法一:
select * from views order by rand() limit 1;
上面语句大概需要57.53秒
受影响行数: 0 已找到记录: 1 警告: 0 持续时间 1 查询: 57.531 sec.
select id from views order by rand() limit 1;
受影响行数: 0 已找到记录: 1 警告: 0 持续时间 1 查询: 12.563 sec.
方法二:
SELECT * FROM views AS t1 JOIN (
SELECT ROUND(
RAND() * ((SELECT MAX(id) FROM views)-(SELECT MIN(id) FROM views))
+(SELECT MIN(id) FROM views)
) AS rid
) AS t2
WHERE t1.id >= t2.rid
ORDER BY t1.id LIMIT 1;
同样的四百二十万条数据需要时间平均0.02秒
受影响行数: 0 已找到记录: 1 警告: 0 持续时间 1 查询: 0.141 sec.
受影响行数: 0 已找到记录: 1 警告: 0 持续时间 1 查询: 0.062 sec.
受影响行数: 0 已找到记录: 1 警告: 0 持续时间 1 查询: 0.016 sec.
受影响行数: 0 已找到记录: 1 警告: 0 持续时间 1 查询: 0.015 sec.
参考:
http://www.thinkphp.cn/topic/5206.html