问题场景是从学生注册表中,随机选取指定年级的学生,来参与比赛,这是一个随机选取学生的sql
语句如下,执行以后,发现结果异常,随机数结果偏小
SELECT id FROM `t_biz_member_class_info`
WHERE `id` > floor(RAND() * (SELECT MAX(id) FROM `t_biz_member_class_info` WHERE `grade` = 3 ))
AND `grade` = 3 ORDER BY id LIMIT 100
于是我们跟踪sql 逻辑发现
拆解后的语句1 -- 选取随机id的边界
SELECT floor( RAND() * (SELECT MAX(id) FROM `t_biz_member_class_info` WHERE `grade` = 3 ) )
执行正常
拆解后的语句2 - 根据找出随机边界, 找出一条学生记录
SELECT * FROM `t_biz_member_class_info` WHERE id >= ? AND `grade` = 3 ORDER BY id LIMIT 1
执行正常
我们的数据量在15w左右,将sql拆解成2条,分别执行后随机选取的学生 id号在1000-15w之间,逻辑都正常,但是合并成一条sql后,随机数结果 id全部< 3000 明显异常。