MySQL中从表中取出随机数据性能优化

最简的办法

rand() 函数实例

 代码如下 复制代码

SELECT * FROM table_name ORDER BY rand() LIMIT 5;

花时间为 0.7888

如果这样在数据量大时就挂了 后来找到一个办法

 代码如下 复制代码

SELECT * FROM table_name AS r1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM table_name)) AS id) AS

r2 WHERE r1.id >= r2.id ORDER BY r1.id ASC LIMIT 5;

花时间0.02 sec

上面的语句采用的是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 秒

时间: 2024-11-30 00:16:03

MySQL中从表中取出随机数据性能优化的相关文章

从MySQL数据库表中取出随机数据的代码_php技巧

MySQL 如何从表中取出随机数据  以前在群里讨论过这个问题,比较的有意思.mysql的语法真好玩. 他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询. 翻了手册,找到了下面这个语句,可以完成任务了 SELECT * FROM table_name ORDER BY rand() LIMIT 5; rand在手册里是这么说的: RAND()  RAND(N)  返回在范围0到1.0内的随机浮点值.如果一个整数参数N被指定,它被用作种子值.  mysql> select RAND

jsp-java 中JSP 实现把excel表中数据导入到mysql数据库中的表中的具体实现方法

问题描述 java 中JSP 实现把excel表中数据导入到mysql数据库中的表中的具体实现方法 java 中JSP 实现把excel表中数据导入到mysql数据库中的表中的具体实现方法 解决方案 参考:http://blog.csdn.net/casilin/article/details/5750773 解决方案二: 楼主幸苦了!!谢谢分享!!! 解决方案三: jsp导excel到mysql数据库 http://wenku.it168.com/d_000468232.shtml

mysql保存一条有id的数据到表中,表中id可以不变吗

问题描述 mysql保存一条有id的数据到表中,表中id可以不变吗 mysql保存一条有id的数据到表中,表中新增的数据id可以不变吗?所有字段不都变,可以不 解决方案 如果列上面被设置成了主键或加上了唯一性约束,那么这一列上的数据在每一行中都要不一样. 如果你说的id列有被设置成主键或者唯一性约束的话,就不能不变. 没有主键和唯一性约束的话,可以有完全相同的两条或多条的一样的数据. 但为了区分每一行数据,在数据库设计上面会将设置一列做为主键. 解决方案二: 如果id不是唯一主键,就可以一样 解

mysql update 根据表中字段查询另一张表更新更新

问题描述 mysql update 根据表中字段查询另一张表更新更新 mysql有两张表, 班级表class,包含 | id | name | | 1 | 一班 | | 2 | 二班 | 学生表student,其中classId为空,className有值并对应class表中的name | id | name | classId | className | | 1 | 一班 | | 一班 | | 2 | 二班 | | 二班 | | 3 | 一班 | | 一班 | | 4 | 二班 | | 二班

asp.net 如何读取客户端电脑中SQLITE表中的数据

问题描述 如题:如何读取客户端电脑中SQLITE表中的数据 解决方案 解决方案二:做不到吧,你数据库的账号密码都不知道首先解决方案三:我本地机器SQLITE是统一开发的单机程序解决方案四:首先要知道你要取得数据的ip地址,数据库名称,用户名,密码,然后建立数据连接,就可以得到数据了.解决方案五:这个用VB程序写在excel里比较好解决方案六:sqlite,一般都是作为单机版的数据库使用网络环境使用,建议改用其他数据,比如mssql.oracle.mysql等等

jsp mysql-jsp页面如何实现一个用mysql创建的表中的信息

问题描述 jsp页面如何实现一个用mysql创建的表中的信息 这是我的jsp界面 <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> My JSP 用户名: 密 码 </body> </html> 而且我的数据库也连接上了,连接代码放在src/com.ming.java/DB类中,我在数据库中还建了一张表格userinfo

Java中form表单submit之后数据发生了重置。

问题描述 Java中form表单submit之后数据发生了重置. 在java中我用form表单提交后,页面等于刷新了,等于按了一次F5,所以刚才填写的数据会初始化,也就是说刚才选择的数据全部丢失了,现在除了用ajax无刷新提交外,怎么让点击submit按钮后,数据还保留??!(不要告诉我把数据放到session中,这样做是不科学的,另外加重页面刷新速度,只是投机取巧,谁有好的方法????) 解决方案 将表单提交到隐藏的iframe也行,不一定就是ajax <iframe style="di

select-怎么 同时把数据库中 一个表的多条数据的一个自段修改,

问题描述 怎么 同时把数据库中 一个表的多条数据的一个自段修改, 数据库表 ,student , 字段 stu_id, stu_name,Stu_num,Stu_sex, 表 import , 字段, stu_id, import_id, imp_data, imp_name, 在查出两个表关联信息的时候,怎么把imprt表中的imp_data 字段改为系统当前时间 update import set imp_data =sysdata where stu_id in (select stu_i

MYSQL 大数据性能优化

批量插入优化 在网上找了一些插入大量数据性能优化资料,提到了比较重要的一点是将 Java代码   insert into tablename(f1,f2,...) values (d1,d2,...);   insert into tablename(f1,f2,...) values (d1,d2,...);   ...    这样的单条单条的insert语句改造成 Java代码   insert into tablename(f1,f2,...) values (d1,d2,...),(d1