mysql优化取随机数据慢的方法
网络编程 2021-07-05 15:27www.168986.cn编程入门
mysql取随机数据慢,怎么办?狼蚁网站SEO优化长沙网络推广与大家一起来看看mysql取随机数据慢优化的过程。
前天因为工作需要我把从一个5W记录的数据库中随机抽取几条记录了,这里我是直接使用mysql rand by函数来直接,几千条记录没关系,但如果到了几万条感觉要几秒,这个就很慢了,狼蚁网站SEO优化长沙网络推广与大家一起来看看mysql 取随机数据慢优化过程。
MySQL很多时候需要获取随机数据,举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是
SELECT FROM tablename ORDER BY RAND() LIMIT 1
,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。在MYSQL 3.23版本中,仍然可以通过ORDER BY RAND()来实现随机。
测试一下才发现这样效率非常低。一个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秒不到。
狼蚁网站SEO优化的语句采用的是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(
# 最小值 + (1 至 最小与最大值差)
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中使用函数效率还要高很多。
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 10;
这个就是我自己选用了,从以前5秒到现面0.0003秒时间都不用就查出10条记录了。
MySQL很多时候需要获取随机数据,举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是
代码如下:
SELECT FROM tablename ORDER BY RAND() LIMIT 1
,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。在MYSQL 3.23版本中,仍然可以通过ORDER BY RAND()来实现随机。
测试一下才发现这样效率非常低。一个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秒不到。
狼蚁网站SEO优化的语句采用的是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(
# 最小值 + (1 至 最小与最大值差)
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中使用函数效率还要高很多。
代码如下:
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 10;
这个就是我自己选用了,从以前5秒到现面0.0003秒时间都不用就查出10条记录了。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程