需求:
随机读取表的一条记录
数据准备:
1.表结构
mysql> desc tb_random; +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(200) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+
数据量:百万
实现:
1.基于rand()
SELECT * FROM tb_random ORDER BY rand() LIMIT 1;
2.基于随机id取值,借助rand()和FLOOR()
SELECT * FROM tb_random WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM tb_random ) ORDER BY id LIMIT 1;
性能可以通过explain来看执行计划:
explain SELECT * FROM tb_random ORDER BY rand() LIMIT 1 \G;
结果:
*************************** 1. row *************************** id: 1 select_type: SIMPLE table: tb_random type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 15995114 Extra: Using temporary; Using filesort 1 row in set (0.00 sec)
结论:没有采用索引
第二种方案:
explain SELECT * FROM tb_random WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM tb_random ) ORDER BY id LIMIT 1 \G;
结果:
*************************** 1. row *************************** id: 1 select_type: PRIMARY table: tb_random type: index possible_keys: NULL key: PRIMARY key_len: 4 ref: NULL rows: 1 Extra: Using where *************************** 2. row *************************** id: 2 select_type: UNCACHEABLE SUBQUERY table: tb_random type: index possible_keys: NULL key: PRIMARY key_len: 4 ref: NULL rows: 15995114 Extra: Using index 2 rows in set (0.00 sec)
结论:using index
PS:
mysql函数 写道
floor:函数只返回整数部分,小数部分舍弃。
round:函数四舍五入,大于0.5的部分进位。
round:函数四舍五入,大于0.5的部分进位。
相关推荐
RAND() 随机生成 0~1 之间的小数(0<1) CEILING 向上取整 FLOOR 向下取整 2. 生成随机数 -- 生成 3 位的随机数 SELECT CEILING(RAND()*900+100); -- 生成 4 位的随机数 SELECT CEILING(RAND()*9000+1000);...
本文实例总结了php随机取mysql记录方法。...把 limit 后面的数值改为你想随机抽取的条数,这里只取一条. 方法二,代码如下: 复制代码 代码如下:$query= “SELECT count(*) as count FROM recommends”; …
这里我是直接使用mysql rand by函数来直接,几千条记录没关系,但如果到了几万条感觉要几秒,这个就很慢了,下面小编与大家一起来看看mysql 取随机数据慢优化过程。MySQL很多时候需要获取随机数据,举个例子,要从...
temperature = ROUND (3.0 + (RAND() * 1.0),1), humidity =ROUND (75.0 + (RAND() * 1.0),1), noise =ROUND(25.0 + (RAND() * 45.0),1), pm = ROUND(8.0 + (RAND() * 5.0),1), wind_speed...
一个15万余条的库,查询5条数据,居然要8秒以上搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。 代码如下:SELECT * FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table...
在mysql中带了随机取数据的函数,在mysql中我们会有rand()函数,很多朋友都会直接使用,如果几百条数据肯定没事,如果几万或百万时你会发现,直接使用是错误的。下面我来介绍随机取数据一些优化方法。 SELECT * FROM...
最近由于需要大概研究了一下MYSQL的随机抽取实现方法。举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。 有两个方法可以达成以上效果. 1.新建...
但是在MYSQL 3.23版本中,仍然可以通过ORDER BY RAND()来实现随机。 但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上。查看官方手册,也说rand()放在ORDER BY 子句中会被执行...
MySQL的rand()函数在手册里是这么说的: RAND() RAND(N) 返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指定,它被用作种子值。 关于MySQL的rand()函数的效率问题,大家可以参考《MySQLL Order By Rand()效率...
MySQL 如何从表中取出随机数据 以前在群里讨论过这个问题,比较的有意思.mysql的语法真好玩. 他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询. 翻了手册,找到了下面这个语句,可以完成任务了 ...
原因是因为MySQL会创建一张零时表来保存所有的结果集,然后给每个结果一个随机索引,然后再排序并返回。有几个方法可以让它快起来。基本思想就是先获取一个随机数,然后使用这个随机数来获取指定的行。由于所有的行...
顺便给你找了点关于mysql rand函数的实例,如下:那就在insert 命令中,value()里面用rand(),注意字段宽度是否够一直以为mysql随机查询几条数据,就用SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了。
要随机生成字符串代码如下: 在MySQL中定义一个随机串的方法,然后再SQL语句中调用此方法。 随机串函数定义方法: 代码如下: CREATE DEFINER=`root`@`localhost` FUNCTION `rand_string`(n INT) RETURNS varchar(255...
他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询. 翻了手册,找到了下面这个语句,可以完成任务了,但效率较低 SELECT * FROM table_name ORDER BY rand() LIMIT 5;...mysql> select RAND(20)
最近由于需要大概研究了一下...但是在MYSQL 3.23版本中,仍然可以通过ORDER BY RAND()来实现随机。 但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上。查看官方手册,也说rand
而在mysql里,随机数函数rand不能传参,产生的0到1之间的浮点数,要是我们需要在mysql产生大于1的随机整数,该怎么办呢? 这样的需求并不陌生,例如,咱做的文章系统,需要作弊,给文章的浏览量随机加上某个范围内的...
MySQL随机查询出一条记录: 代码如下: — 下面的查询语句效率高,不要使用 SELECT * FROM table1 ORDER BY rand() LIMIT 1 来查询 SELECT * FROM table1 WHERE id=(SELECT id FROM table1 ORDER BY rand() LIMIT 1)...