优化mysql数据库随机取数据Sql的优化
简要说明
根据Mysql官方文档,rand()的取值范围为[0,1)
1.若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1))
#例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机整数, 可使用以下语句:
SELECT FLOOR(7 + (RAND() * 6));
2.另外,也可以用round四舍五入函数来实现,考虑到最前与最后的取值概率会与中间的不相等,故加上0.5来消除这种概率上的差异,达到均匀分布:
产生[i,j]范围正整数:select round(rand()*(j-i+1)+i-0.5)
#若要在7 到 12 的范围(包括7和12)内得到一个随机整数, 可使用以下语句:
SELECT round( (RAND() * 6+6.5));
优化结果
原Sql
SELECT
*
FROM
t_sys_mission_record
ORDER BY
rand( )
LIMIT 1
FOR UPDATE
优化后Sql
SELECT
t1.*
FROM
t_sys_mission_record t1
INNER JOIN (
SELECT
ROUND(
RAND( ) * ( ( SELECT MAX( id ) FROM t_sys_mission_record ) - ( SELECT MIN( id ) FROM t_sys_mission_record ) ) + ( SELECT MIN( id ) FROM t_sys_mission_record )
) AS id
) AS t2
WHERE
t1.id >= t2.id
ORDER BY
t1.id
LIMIT 1 FOR UPDATE