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条记录了。
编程语言
- 宿迁百度关键词排名指南:实现精准营销的关键
- 四川SEO优化怎么做网络推广
- 立昂技术备案老域名收购:如何为您的业务赋能
- 安徽百度关键词seo贵不贵,一般需要多少钱
- 吉林百度快照排名怎么做电话营销
- 多伦新手做SEO怎么做
- 甘肃优化关键词排名推广怎么做论坛营销
- 沙雅SEO网站推广:提升您的在线可见性
- 四川SEO优化如何提升销售额和销售量
- 聂荣网站排名优化:提升网站可见性的全方位指
- 涞水SEO:提升地方企业在线可见性的策略
- 辽宁百度seo排名怎样做网站排名
- 临湘哪有关键词排名优化:提升网站可见度的关
- 黑龙江百度网站优化有没有优惠
- 凉城优化关键词排名推广:提升您的网络可见性
- 萝北整站优化:提升您网站流量和排名的全面指