博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql实现随机查询
阅读量:6221 次
发布时间:2019-06-21

本文共 1992 字,大约阅读时间需要 6 分钟。

  hot3.png

一、随机查询一条数据

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

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

方法二:SELECT * FROM `table` 

             WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))  
             ORDER BY id LIMIT 1;

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

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

WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`))) 这句话筛选出所有的大于生成随机数的id的行然后最后就把大于这个随机id的行查询出来,然后按照id排序,选择第一个,就相当与获取了所有行中随机的一行。

评价:有问题,如果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)中的随机数。

方法四要比方法三稍快一点, 这篇博客指出,15w条数据前者花费时间 0.147433 秒,后者花费时间 0.015130 秒。

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

 

二、随机查询多条数据

方法一:把随机查询一条数据的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条就好了。

好文要顶 关注我 收藏该文  

转载于:https://my.oschina.net/sunYwp/blog/903582

你可能感兴趣的文章
在 HAproxy 1.5 中使用 SSL 证书 【已翻译100%】(2/2)
查看>>
《电子元器件的可靠性》——2.4节电子元器件的失效规律
查看>>
《FLUENT 14流场分析自学手册》——第1章 流体力学基础 1.1 流体力学基本概念
查看>>
《机器人爱好者(第3辑)》——DRC机器人是很好的榜样
查看>>
Java RESTful Web Service实战(第2版) 导读
查看>>
CAAI演讲实录丨李德毅院士:交互认知——从图灵测试的漏洞谈开去
查看>>
《Java入门经典(第7版)》—— 导读
查看>>
《TensorFlow技术解析与实战》——2.5 依赖的其他模块
查看>>
《 线性代数及其应用 (原书第4版)》——1.10 经济学、科学和工程中的线性模型...
查看>>
《JUnit实战(第2版)》—第1章1.4节JUnit的设计目标
查看>>
《OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》一6.2 基本光照效果
查看>>
在Ubuntu中安装XScreenSaver
查看>>
《HTML5 2D游戏编程核心技术》——第3章,第3.9节使用视差产生视深的假象
查看>>
Practical Clojure - 简介
查看>>
深入下Ruby中的String
查看>>
Django 博客开发教程 4 - 让 Django 完成翻译:迁移数据库
查看>>
《Python密码学编程》——2.7 在线跟踪程序
查看>>
雾里看花之 Python Asyncio
查看>>
《树莓派Python编程入门与实战》——3.9 总结
查看>>
Velocity官方指南-使用Velocity
查看>>