一直以为mysql随机查询几条数据,就用
SELECT * FROM `table` ORDER BY RAND() LIMIT 5
就可以了。
但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上
查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。
You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.
搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。
SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id ASC LIMIT 5;
但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。
上面的语句采用的是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 秒
看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。
本文章非原创mc
分享到:
相关推荐
综上所述,优化MySQL的随机查询记录效率通常涉及避免在`ORDER BY`中使用`RAND()`,以及利用`id`字段的范围来计算随机索引。通过这样的方法,即使在大型数据集中,也能快速有效地获取随机记录,从而提高应用性能。在...
order by rand() 但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但是在MYSQL 3.23版本中,仍然可以通过ORDER ...
举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。 但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句...
在MySQL数据库操作中,随机查询和随机更新数据是两种常见的需求,特别是在数据分析、测试或创建随机样本时。本文将详细探讨这两个概念,并提供相应的实现代码。 首先,我们来看如何在MySQL中实现随机查询数据。当你...
在MySQL中,随机查询是常见的需求,特别是在数据分析、测试或者某些特定的应用场景中。然而,直接使用`ORDER BY RAND()`可能会导致性能问题,因为它需要全表扫描,这在大数据量时尤为明显。以下是一些避免这种性能...
在实际应用中,为了获取多条随机记录,可以将上述单条记录的查询封装在循环中,虽然这会增加总的执行时间,但每条记录的获取速度依然较快。 总结来说,从MySQL中高效地随机获取数据,需要避免在`ORDER BY`子句中...
压力测试脚本执行时,可以通过调用这个存储过程,插入大量的数据,观察MySQL服务器的响应时间、CPU使用率、内存占用、磁盘I/O等指标,从而分析其在高并发情况下的表现。此外,还可以使用像sysbench、loadrunner这样...
### MySQL性能测试脚本知识点详解 #### 一、创建数据库表结构 在MySQL性能测试脚本中,首先涉及到了三个数据库表的创建:部门表(`dept`)、员工表(`emp`)以及工资级别表(`salgrade`)。这三个表的创建语句及其...
在MySQL数据库中,有时我们需要对数据进行分组处理,并从每个分组中随机选取一条记录。这在统计分析或者抽样调查等场景中非常常见。本文将详细介绍如何在MySQL中实现这一操作,以及一些关于随机选取数据的优化方法。...
Oracle使用`DBMS_RANDOM.VALUE`,MySQL可以选择更高效的子查询方式或直接使用`RAND()`,而MS SQL Server则依赖于`NEWID()`。无论哪种方法,随机排序都可以为数据分析、测试或特定业务需求提供帮助。在实际应用中,应...
MySQL中是使用SELECT语句来查询数据的。在这一章中将讲解的内容包括。 1、查询语句的基本语法 2、在单表上查询数据 3、使用聚合函数查询数据 4、多表上联合查询 5、子查询 6、合并查询结果 7、为表和字段取别名 8、...
然而,如果需要抽取多条非连续的记录,就需要在外部进行循环,每次查询一条,这样虽然效率较高,但整体仍然不如一次性抽取所有需要的随机记录。 在实际应用中,如果表的主键ID是连续的,那么这种方法非常有效。但...
在MySQL中,插入随机字符串数据通常用于测试环境,模拟真实数据以验证数据库操作或性能测试。以下是如何在MySQL中实现这一目标的详细步骤: 首先,我们需要创建一个存储数据的表。例如,创建一个名为`tables_a`的表...
例如,`SELECT * FROM table ORDER BY RAND() LIMIT 5`将返回表中的五个随机记录。请注意,这种方法在大数据集上可能会较慢,因为需要排序整个表。 最后,**数据转换**是SQL中的一个重要方面,涉及类型转换、格式化...
例如,如果你有一个名为`table`的表,你可以使用以下SQL语句来获取5条随机记录: ```sql SELECT * FROM `table` ORDER BY RAND() LIMIT 5; ``` 然而,这种方法在数据量较大的情况下效率极低,因为它会将整个表进行...
6. **避免使用ORDER BY RAND()**:这会导致MySQL对所有结果进行随机排序,消耗大量CPU资源。若需随机选择记录,可考虑使用其他方法,如先生成一个随机ID,再根据ID进行查询。 7. **避免SELECT ***:尽量指定需要的...