在mysql中查询5条不重复的数据,使用以下:
1 SELECT * FROM `table` ORDER BY RAND() LIMIT 5
就可以了。但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上
搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。
1 SELECT *
2 FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
3 WHERE t1.id >= t2.id
4 ORDER BY t1.id ASC LIMIT 5;
但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。
上面的语句采用的是JOIN,mysql的论坛上有人使用
1 SELECT *
2 FROM `table`
3 WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
4 ORDER BY id LIMIT 1;
我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距。总觉有什么地方不正常。
于是我把语句改写了一下。
1 SELECT * FROM `table`
2 WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
3 ORDER BY id LIMIT 1;
这下,效率又提高了,查询时间只有0.01秒
最后,再把语句完善一下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。
完整查询语句是:
1 SELECT * FROM `table`
2 WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECTMIN(id) FROM `table`)))
3 ORDER BY id LIMIT 1;
4
5 SELECT *
6 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
7 WHERE t1.id >= t2.id
8 ORDER BY t1.id LIMIT 1;
最后对这两个语句进行分别查询10次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。
来自:http://blog.csdn.net/zxl315/article/details/2435368
浏览更多有关 mysql 随机查询的文章。
ps:上面的查出来的数据是连续的,如果想要得到非连续数据则可以用如下方法:
1. 能过EXISTS子查询得到几个随机数,再从中取得数据(不推荐,50W条数据耗时1秒多,只能说这是一种方法来参考)
SELECT DISTINCT
2 c.id, c.`name`, c.age, c.address
3 FROM
4 contact as c
5 WHERE
6 EXISTS (SELECT 1 FROM (SELECT
7 ROUND(RAND() * (SELECT MAX(id) - MIN(id) FROM contact) + (SELECT MIN(id) FROM contact)) AS id
8 from contact LIMIT 40) AS t1 WHERE t1.id = c.id)
9 LIMIT 4;
2. 通过JOIN来得到随机数据,50W条数据耗时0.001秒
1 SELECT DISTINCT
2 c.id, c.`name`, c.age, c.address
3 FROM
4 contact as c
5 JOIN (SELECT ---www.jbxue.com
6 ROUND(RAND() * (SELECT MAX(id) - MIN(id) FROM contact) + (SELECT MIN(id) FROM contact)) AS id
7 FROM contact LIMIT 40) AS t2 ON c.id = t2.id
8 LIMIT 4;
就可以了。但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上
搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。
1 SELECT *
2 FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
3 WHERE t1.id >= t2.id
4 ORDER BY t1.id ASC LIMIT 5;
但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。
上面的语句采用的是JOIN,mysql的论坛上有人使用
1 SELECT *
2 FROM `table`
3 WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
4 ORDER BY id LIMIT 1;
我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距。总觉有什么地方不正常。
于是我把语句改写了一下。
1 SELECT * FROM `table`
2 WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
3 ORDER BY id LIMIT 1;
这下,效率又提高了,查询时间只有0.01秒
最后,再把语句完善一下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。
完整查询语句是:
1 SELECT * FROM `table`
2 WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECTMIN(id) FROM `table`)))
3 ORDER BY id LIMIT 1;
4
5 SELECT *
6 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
7 WHERE t1.id >= t2.id
8 ORDER BY t1.id LIMIT 1;
最后对这两个语句进行分别查询10次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。
来自:http://blog.csdn.net/zxl315/article/details/2435368
浏览更多有关 mysql 随机查询的文章。
ps:上面的查出来的数据是连续的,如果想要得到非连续数据则可以用如下方法:
1. 能过EXISTS子查询得到几个随机数,再从中取得数据(不推荐,50W条数据耗时1秒多,只能说这是一种方法来参考)
SELECT DISTINCT
2 c.id, c.`name`, c.age, c.address
3 FROM
4 contact as c
5 WHERE
6 EXISTS (SELECT 1 FROM (SELECT
7 ROUND(RAND() * (SELECT MAX(id) - MIN(id) FROM contact) + (SELECT MIN(id) FROM contact)) AS id
8 from contact LIMIT 40) AS t1 WHERE t1.id = c.id)
9 LIMIT 4;
2. 通过JOIN来得到随机数据,50W条数据耗时0.001秒
1 SELECT DISTINCT
2 c.id, c.`name`, c.age, c.address
3 FROM
4 contact as c
5 JOIN (SELECT ---www.jbxue.com
6 ROUND(RAND() * (SELECT MAX(id) - MIN(id) FROM contact) + (SELECT MIN(id) FROM contact)) AS id
7 FROM contact LIMIT 40) AS t2 ON c.id = t2.id
8 LIMIT 4;
相关推荐
MySQL随机查询数据 以前在群里讨论过这个问题,比较的有意思.MySQLl的语法真好玩.他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询.翻了手册,找到了下面这个语句,可以完成任务了。 代码如下: SELECT * ...
在mysql中查询5条不重复的数据,使用以下: 代码如下:SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了。但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上搜索Google...
通过存储过程快速生成实验所需的随机数据,包含创建表,创建存储过程和调用存储过程
它包括数据查询、数据更新、数据插入和数据删除等操作。通过这款工具,用户可以学习如何编写简单的SQL语句,如SELECT, INSERT, UPDATE, DELETE等。 3. **数据生成**:工具中的数据生成功能可以模拟各种类型的数据,...
在MySQL数据库中,查询随机数据是一项常见的需求,但如何高效地实现这一操作却是一门学问。本文将探讨四种不同的方法,并进行性能对比。 首先,我们来看最直观但也效率最低的方法——方案一: ```sql SELECT * FROM...
MySQL是一种广泛使用的开源关系型数据库管理系统,而JSON(JavaScript Object Notation)则是一种轻量级的数据交换格式,常用于Web服务和前后端数据传输。在MySQL中,将数据转换为JSON格式是常见的需求,尤其在处理...
mysql 125w条生成的随机数据,近似真实。主要字段有: id,user_name(随机英文字符),real_name(中文名),password(32位),province,city,address,img_url,role_id,telphone,email(正常的邮箱格式),create_time,update_...
"批量生成mysql中文测试数据"是一个专门针对这一需求而设计的工具,主要用于生成大量的中文测试数据,以便于开发者进行中文搜索功能的测试和MySQL数据库的优化工作。 这个工具采用PHP语言编写,PHP是一种广泛使用的...
在执行数据库操作时,尤其是查询操作,系统可能需要从数据文件的任意位置读取或写入数据页,这就形成了随机读写。因为数据页在磁盘上的位置是不固定的,所以需要通过磁盘的随机读写来获取或更新数据。磁盘随机读写的...
在MySQL中,获取随机数据是常见的需求,尤其是在测试、数据分析或者构建某些特定功能时。本文将探讨两种常用的方法,以及如何根据数据量和需求选择合适的方法。 方法一:使用`ORDER BY RAND()`函数 `ORDER BY RAND...
通过调用这些过程,用户可以便捷地将生成的随机数据插入到MySQL表中。 4. **测试数据的重要性**:在软件开发和数据库管理中,测试数据至关重要。它可以确保系统在不同数据条件下表现正常,有助于找出潜在的问题和...
在IT行业中,数据管理是一项关键任务,特别是在...通过以上步骤,我们可以有效地将`prov.csv`中的数据导入到MySQL数据库中,实现数据的快速迁移和测试数据的准备。熟练掌握这种方法对于提升数据库管理的效率至关重要。
本文实例讲述了PHP实现在数据库百万条数据中随机获取20条记录的方法。分享给大家供大家参考,具体如下: 额,为什么要写这个? 在去某个公司面试时,让写个算法出来,当时就蒙了,我开发过程中用到算法的吗?又不是...
根据提供的标题、描述、标签及部分内容,我们可以提炼出与“SQL随机查询数据”相关的知识点,主要包括以下几个方面: ### SQL 随机查询基础知识 在数据库管理中,有时我们需要从大量数据中随机抽取一部分数据用于...
在MySQL中,随机抽取查询是常见的需求,但使用`ORDER BY RAND()`往往会导致效率低下,尤其是在处理大数据量的表时。这是因为`RAND()`函数在`ORDER BY`子句中会被执行一次对应于每一行的数据扫描,这使得全表扫描成为...
在MySQL中,随机获取数据是一项常见的需求,但不恰当的方法可能会导致性能问题,尤其是在处理大量数据时。这里我们将深入探讨MySQL中的随机函数及其效率。 首先,最直观的随机选取数据的方法是使用`ORDER BY RAND()...