建立测试表
1 | -- 用户表 |
生成测试数据
1 | -- 创建存储过程 |
5OO万数据中获取随机7条记录
1 | -- 第一种:查询时间 6.654s, 数据随机, 大数据量时效率太差(不推荐) |
ID 不连续或分配不均匀
场景:总共有用户100个, type = 1 的用户ID为 20-30 和 70-90, 随机获取7条 type = 1 的用户数据
错误的解决方案
采用第二种方式, 取得的随机数范围为 1-100, 即使在获取随机数时加上条件, 随机数能命中 type = 1 的用户ID的概率并不高, 有可能出现获取数据为空的情况, 所以这种情况下, 不建议采用这种方式获取随机记录
1 SELECT MAX(id) - MIN(id) FROM user WHERE type = 1
建议解决方案
创建 user_map 表, 保存所有 type = 1 的用户ID, 这样一来, 只要随机获取 user_map 表内的 id, 根据 id 找到对应的用户即可
1
2
3
4
5
6
7
8 SELECT * FROM user u
INNER JOIN (
SELECT um.* FROM user_map um
INNER JOIN (
SELECT ROUND(RAND() * (SELECT MAX(id) - MIN(id) FROM user_map) + (SELECT MIN(id) FROM user_map)) AS rnd FROM user_map LIMIT 7
) umm ON um.id = umm.rnd
LIMIT 7
) um ON u.id = um.user_id