一直以为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中使用函数效率还要高很多。
原帖:http://blog.163.com/fjs_fang/blog/static/44818481200853023353468/
分享到:
相关推荐
一个15万余条的库,查询5条数据,居然要8秒以上搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。 代码如下:SELECT * FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table...
今天偶然想起来一个坑爹数据,如:PHP取百万条数据中随机20条记录,当时就用的算法。 1.先统计统计数据库多少条记录(这个做个数据缓存,如1小时重新统计一次), 2.根据总条数,随机1次,1次性取出20条记录(当然这...
在描述中提到了显示5条数据,这可能意味着查询结果被限制在了前五条记录。在SQL中,我们可以使用`LIMIT`子句来实现这一点,如`SELECT ... LIMIT 5;`。 生成的JSON数据通常会以文本形式显示,或者保存到文件中。如果...
补充知识:在MySQL中,随机选取多条数据也有多种方法,但效率各不相同。以下列举了六种常见的方法: 1. 直接使用`RAND()`函数: ```sql SELECT * FROM tablename ORDER BY RAND() LIMIT 想要获取的数据条数; ```...
本教程将详述如何使用Apache POI库读取Excel数据,并通过Java的JDBC接口批量插入到MySQL数据库中。Apache POI是Java平台上的一个开源项目,它允许程序员创建、修改和显示Microsoft Office格式的文件,其中包括Excel...
批量导入CSV数据到MySQL的过程中,需要注意以下几点: 1. 数据格式一致性:确保CSV文件中的数据格式与MySQL表中的列类型匹配。 2. SQL注入:在构建动态SQL语句时,避免SQL注入攻击,可以使用参数化查询或预编译语句...
类似于随机查询一条数据的方法四,但在此基础上,先生成n个随机ID,然后与原表JOIN,最后按ID排序并取前n条。这种方法可以确保返回的是随机分布的多条数据。 ### 性能优化建议 - 对于大表,避免使用`ORDER BY ...
根据提供的标题、描述、标签及部分内容,我们可以提炼出与“SQL随机查询数据”相关的知识点,主要包括以下几个方面: ### SQL 随机查询基础知识 在数据库管理中,有时我们需要从大量数据中随机抽取一部分数据用于...
综上所述,通过使用`PreparedStatement`和开启`rewriteBatchedStatements`,以及合理的数据库配置和优化策略,可以有效地实现高效的大规模数据插入,如6秒钟内插入100万条数据到MySQL数据库。这样的实践对于大数据...
块压缩的原理是将多条数据打包成块并进行索引,但增大或减小块大小都会影响压缩效果和解压效率。此外,块缓存和操作系统文件缓存的存在增加了双缓存问题,降低了内存利用率。 随着硬件的发展,SSD和NVMe/PCIe接口的...
前天因为工作需要我把从一个5W记录的数据库中随机抽取几条记录了,这里我是直接使用mysql rand by函数来直接,几千条记录没关系,但如果到了几万条感觉要几秒,这个就很慢了,下面小编与大家一起来看看mysql 取随机...
查询数据是指从数据库中的数据表或视图中获取所需要的数据,在mysql中,可以使用SELECT语句来查询数据。根据查询条件的不同,数据库系统会找到不同的数据。 SELECT语句的基本语法格式如下: [sql] view plain copy ...
在mysql中带了随机取数据的函数,在mysql中我们会有rand()函数,很多朋友都会直接使用,如果几百条数据肯定没事,如果几万或百万时你会发现,直接使用是错误的。下面我来介绍随机取数据一些优化方法。 SELECT * FROM...
3. **检查数据质量**:随机抽查几条记录,确认数据格式正确无误。 #### 七、总结 本文详细介绍了从Access数据库导入数据到MySQL的过程。整个过程涉及到多个步骤,包括数据导出、格式调整、MySQL表结构设计以及数据...
标题中的“百万级测试数据”指的是一个包含大量条目的数据集,总计四百三十多万条。这样的数据集通常用于在软件开发过程中验证和优化应用程序的功能,确保其在处理大规模数据时能正常工作。测试数据是模拟真实世界...
3. **仅适用于单条随机记录的选择**:虽然可以通过限制查询结果的数量(如`LIMIT`)来获取多条记录,但除了第一条记录外,其余记录的选择并不是真正的随机,而是基于`random`数据列的排序结果。 #### 利用`id`数据...
这是最常见的一种方法,通过在SQL查询语句中使用`ORDER BY RAND()`来对查询结果进行随机排序,然后利用`LIMIT`限制返回的记录数量。例如,如果想要从`tablename`表中随机获取一条记录,可以使用以下代码: ```php $...
通过以上内容,我们可以看出,一条SQL更新语句在MySQL中的执行并不仅仅是对数据表的直接修改,而是一个涉及多个模块和多个日志系统协同工作的复杂过程。通过redolog和binlog的日志机制,MySQL能够提供强大的数据安全...