SQL查询语句使⽤rand()的执⾏效率与优化若要在i ≤ R ≤ j这个范围得到⼀个随机整数R,需要⽤到表达式 FLOOR(i + RAND() * (j – i + 1))。例如,若要在7 到 12 的范围(包括7和12)内得到⼀个随机整数, 可使⽤以下语句:
SELECT FLOOR(7 + (RAND() * 6));
从 Mysql 表中随机读取数据不难,⽅法还挺多的,但是如果要考虑效率,得到⼀个快速的⾼效率的⽅法,那就不是⼀件简单的事情了(⾄少对我来说不简单)。
随机获得Mysql数据表的⼀条或多条记录有很多⽅法,下⾯我就以users(userId,userName,password……)表(有⼀百多万条记录)为例,对⽐讲解下⼏个⽅法效率问题:
1. select * from users order by rand() LIMIT 1
执⾏该sql语句,⽼半天没有反应,最后被迫⼿动停⽌执⾏,怎个伤⼈了得啊!后来我查了⼀下MYSQL⼿册,⾥⾯针对RAND()的提⽰⼤概意思就是,在 ORDER BY从句⾥⾯不能使⽤RAND()函数,因为这样会导致数据列被多次扫描,导致效率相当相当的低!效率不⾏,切忌使⽤!
2. SELECT * FROM users WHERE userId >= ((SELECT MAX(userId) FROM users)-(SELECT MIN(userId) FROM users)) * RAND() +
(SELECT MIN(userId) FROM users)  LIMIT 1
执⾏该sql语句,⽤时0.039s,效率太给⼒了!接着我就把”LIMIT 1“改为了”LIMIT 10000“,⽤时0.063s。经过多次验证,结果肯定是随机的!
结论:随机取⼀条或多条记录,⽅法都不错!
sql语句优化方式3. 通过sql获得最⼤值和最⼩值,然后通过php的rand⽣成⼀个随机数randnum,再通过SELECT * FROM users WHERE userId >=
randnum LIMIT 1,获得⼀条记录效率应该还可以,多条应该就不⾏了。
结论:⽅法1效率不⾏,切忌使⽤;随机获得⼀条记录,⽅法2也不错;随机获得多条记录,⽅法2没说的!
从Mysql某⼀表中随机读取n条数据的SQL查询语句其他相关资料
但是这样会产⽣连续的5条记录。解决办法只能是每次查询⼀条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。
上⾯的语句采⽤的是JOIN,mysql的论坛上有⼈使⽤
SELECT *
FROM `table`
WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
ORDER BY id LIMIT 1;
我测试了⼀下,需要0.5秒,速度也不错,但是跟上⾯的语句还是有很⼤差距。总觉有什么地⽅不正常。
于是我把语句改写了⼀下。
SELECT * FROM `table`
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
ORDER BY id LIMIT 1;
这下,效率⼜提⾼了,查询时间只有0.01秒
最后,再把语句完善⼀下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有⼀半的时间总是查询到表中的前⾯⼏⾏。
完整查询语句是:
SELECT * FROM `table`
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))
ORDER BY id LIMIT 1;
SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+ (SELECT MIN(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;
最后在php中对这两个语句进⾏分别查询10次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
看来采⽤JOIN的语法⽐直接在WHERE中使⽤函数效率还要⾼很多。
此⽅法limit如果⼤于1,返回的结果会是连续的记录。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。