mysql实现随机查询

1、随机查询一条数据mysql

方法一:SELECT * FROM `table` ORDER BY RAND() limit 1sql

评价:不建议使用,效率很是低,官方文档中进行说明:Order By和RAND()连用,会屡次扫描表,致使速度变慢。函数

方法二:SELECT * FROM `table` 
  WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))  
  ORDER BY id LIMIT 1;ui

      解释:SELECT MAX(id) FROM `table` 这句话查询出最大的id值 spa

               SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)) 这句获取一个小于MAX(id)的随机数.net

WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`))) 这句话筛选出全部的大于生成随机数的id的行设计

    而后最后就把大于这个随机id的行查询出来,而后按照id排序,选择第一个,就至关与获取了全部行中随机的一行。blog

         评价:有问题,若是id不是从0开始的话,好比从10000开始自增,那么 SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)) 获得的将是会哟很大几率获得小于10000的值,通过where限定的查询结果将会是全部的查询结果的概率变大,最后limit 1获取的是第一行数据的概率变高。排序

方法三:SELECT * FROM `table` 
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECTMIN(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;

评价:解决了方法二中MAX(id)的问题,RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECTMIN(id) FROM `table`)能够获取MAX(id)和MIN(id)中的随机数。

方法四要比方法三稍快一点,http://blog.csdn.net/zxl315/article/details/2435368 这篇博客指出,15w条数据前者花费时间 0.147433 秒,后者花费时间 0.015130 秒。

以上解决方案都默认有一个不重复的数字字段,其实如今不少表的设计都是以一个自增段做为主键,固然还有一些是以uuid做为主键的,而没有数字键,这样的话,能够用mysql的函数将uuid的字符串转换成数字。并且还有一个问题,若是id字段的数字分布不均匀的话(好比按照1,4,5,6,7,8,45这样分布),也会形成随机查询的不合理,可是这里就不讨论那么复杂的问题了。


2、随机查询多条数据

方法一:把随机查询一条数据的limit 1修改为limit 5

评价:这样获取的数据会是连续的。

方法二:

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 

from `table` limit 50) AS t2 on t1.id=t2.id

ORDER BY t1.id LIMIT 1;

解释:

SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id 

from `table` limit 50)这样会获取50个随机数字,而后on t1.id=t2.id会挑选出不大于50行的随机数据,而后取5条就行了。