需求
1.数据量超过10W+;
2.能够在0.0秒内(100ms)完成数据的查询;
3.能够实现良好的随机效果。
数据量小的方案
SELECT * FROM `st_poetry` ORDER BY RAND() LIMIT 1;
网上现有方案
网上以下两种思路对数据库表有强制要求,否则无法实现随机效果(表的ID必须为连续自增长的正整数)
方案一:
SELECT * FROM `st_poetry`
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `st_poetry`)-(SELECT MIN(id) FROM `st_poetry`)) + (SELECT MIN(id) FROM `st_poetry`)))
ORDER BY id LIMIT 1;
方案二:
SELECT * FROM ST_POETRY AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM ST_POETRY)-(SELECT MIN(id) FROM ST_POETRY))+(SELECT MIN(id) FROM ST_POETRY)) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id LIMIT 1
个人推荐方案
采用如下思路实现:
1.查询出当前表总记录条数;
2.添加主键索引(主键索引的效率高于唯一索引及其他索引);
3.获取随机数的列建议设置为int或long等整形;
4.获取1至总记录条数中的一个随机数(使用Java或者SQL均可);
5.使用SQL:SELECT * FROM ST_POETRY LIMIT [随机数] 1;
说明:在较大随机数时性能较慢,目前尚未找到完美的解决方案。