`
tomgooityeeee
  • 浏览: 73663 次
文章分类
社区版块
存档分类
最新评论
阅读更多

    一直以为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
 
0
0
分享到:
评论

相关推荐

    MySQL随机查询记录的效率测试分析

    综上所述,优化MySQL的随机查询记录效率通常涉及避免在`ORDER BY`中使用`RAND()`,以及利用`id`字段的范围来计算随机索引。通过这样的方法,即使在大型数据集中,也能快速有效地获取随机记录,从而提高应用性能。在...

    MYSQL 随机 抽取实现方法及效率分析

    order by rand() 但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但是在MYSQL 3.23版本中,仍然可以通过ORDER ...

    MySQL Order By Rand()效率分析

    举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。 但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句...

    MySQL 随机查询数据与随机更新数据实现代码

    在MySQL数据库操作中,随机查询和随机更新数据是两种常见的需求,特别是在数据分析、测试或创建随机样本时。本文将详细探讨这两个概念,并提供相应的实现代码。 首先,我们来看如何在MySQL中实现随机查询数据。当你...

    mysql实现随机查询经验谈

    在MySQL中,随机查询是常见的需求,特别是在数据分析、测试或者某些特定的应用场景中。然而,直接使用`ORDER BY RAND()`可能会导致性能问题,因为它需要全表扫描,这在大数据量时尤为明显。以下是一些避免这种性能...

    MySQL 随机函数获取数据速度和效率分析

    在实际应用中,为了获取多条随机记录,可以将上述单条记录的查询封装在循环中,虽然这会增加总的执行时间,但每条记录的获取速度依然较快。 总结来说,从MySQL中高效地随机获取数据,需要避免在`ORDER BY`子句中...

    mysql压力测试脚本实例

    压力测试脚本执行时,可以通过调用这个存储过程,插入大量的数据,观察MySQL服务器的响应时间、CPU使用率、内存占用、磁盘I/O等指标,从而分析其在高并发情况下的表现。此外,还可以使用像sysbench、loadrunner这样...

    Mysql 性能测试脚本

    ### MySQL性能测试脚本知识点详解 #### 一、创建数据库表结构 在MySQL性能测试脚本中,首先涉及到了三个数据库表的创建:部门表(`dept`)、员工表(`emp`)以及工资级别表(`salgrade`)。这三个表的创建语句及其...

    MySql分组后随机获取每组一条数据的操作

    在MySQL数据库中,有时我们需要对数据进行分组处理,并从每个分组中随机选取一条记录。这在统计分析或者抽样调查等场景中非常常见。本文将详细介绍如何在MySQL中实现这一操作,以及一些关于随机选取数据的优化方法。...

    数据库查询排序使用随机排序结果示例(Oracle/MySQL/MS SQL Server)

    Oracle使用`DBMS_RANDOM.VALUE`,MySQL可以选择更高效的子查询方式或直接使用`RAND()`,而MS SQL Server则依赖于`NEWID()`。无论哪种方法,随机排序都可以为数据分析、测试或特定业务需求提供帮助。在实际应用中,应...

    mysql是使用技巧

    `ORDER BY RAND()`对大数据集非常慢,超过约2千条记录时应避免使用。 11. **查询缓存**: 使用`SQL_NO_CACHE`防止查询结果被缓存,尤其在处理频繁更新或大量数据时。 12. **LIKE查询与通配符**: 避免在`LIKE`...

    MySql基本查询、连接查询、子查询、正则表达查询讲解

    MySQL中是使用SELECT语句来查询数据的。在这一章中将讲解的内容包括。 1、查询语句的基本语法 2、在单表上查询数据 3、使用聚合函数查询数据 4、多表上联合查询 5、子查询 6、合并查询结果 7、为表和字段取别名 8、...

    mysql随机抽取一定数量的记录实例讲解

    然而,如果需要抽取多条非连续的记录,就需要在外部进行循环,每次查询一条,这样虽然效率较高,但整体仍然不如一次性抽取所有需要的随机记录。 在实际应用中,如果表的主键ID是连续的,那么这种方法非常有效。但...

    mysql 如何插入随机字符串数据的实现方法

    在MySQL中,插入随机字符串数据通常用于测试环境,模拟真实数据以验证数据库操作或性能测试。以下是如何在MySQL中实现这一目标的详细步骤: 首先,我们需要创建一个存储数据的表。例如,创建一个名为`tables_a`的表...

    SQL高级实例-模糊查询-分组随机查询-转换

    例如,`SELECT * FROM table ORDER BY RAND() LIMIT 5`将返回表中的五个随机记录。请注意,这种方法在大数据集上可能会较慢,因为需要排序整个表。 最后,**数据转换**是SQL中的一个重要方面,涉及类型转换、格式化...

    mysql随机查询若干条数据的方法

    例如,如果你有一个名为`table`的表,你可以使用以下SQL语句来获取5条随机记录: ```sql SELECT * FROM `table` ORDER BY RAND() LIMIT 5; ``` 然而,这种方法在数据量较大的情况下效率极低,因为它会将整个表进行...

    MySQL性能优化

    6. **避免使用ORDER BY RAND()**:这会导致MySQL对所有结果进行随机排序,消耗大量CPU资源。若需随机选择记录,可考虑使用其他方法,如先生成一个随机ID,再根据ID进行查询。 7. **避免SELECT ***:尽量指定需要的...

Global site tag (gtag.js) - Google Analytics