destoon采集论坛

 找回密码
 立即注册
查看: 443|回复: 8

管理员或高手帮忙下!这个随机调用知道的标签怎么写?

[复制链接]

2

主题

9

回帖

32

积分

新手上路

Rank: 1

积分
32
发表于 2011-6-8 14:51:14 | 显示全部楼层 |阅读模式
我的站的知道有近13万条,使用rand()调用,数据库报错。网上查证,这种调用方法效率极低。数据库死掉了。

 一直以为mysql随机查询几条数据,就用   
SELECT * FROM `table` ORDER BY RAND() LIMIT 5  
  
就可以了。   
但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上

搜索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中使用函数效率还要高很多

如下案例,怎么改成标签调用?或者直接写进模板执行?
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;  
高手帮忙下!

[ 本帖最后由 fenghero 于 2011-6-8 15:01 编辑 ]
回复

使用道具 举报

2

主题

9

回帖

32

积分

新手上路

Rank: 1

积分
32
 楼主| 发表于 2011-6-15 16:03:37 | 显示全部楼层

ding!



回复 支持 反对

使用道具 举报

2

主题

9

回帖

32

积分

新手上路

Rank: 1

积分
32
 楼主| 发表于 2011-10-2 09:24:54 | 显示全部楼层

ding!!

回复 支持 反对

使用道具 举报

2

主题

9

回帖

32

积分

新手上路

Rank: 1

积分
32
 楼主| 发表于 2011-11-1 22:16:15 | 显示全部楼层

直接写进模板的循环语句怎么写?
回复 支持 反对

使用道具 举报

1

主题

15

回帖

45

积分

新手上路

Rank: 1

积分
45
发表于 2011-11-2 08:27:56 | 显示全部楼层


  支持
回复 支持 反对

使用道具 举报

2

主题

9

回帖

32

积分

新手上路

Rank: 1

积分
32
 楼主| 发表于 2012-1-15 23:09:10 | 显示全部楼层

ding !寻求帮助!
回复 支持 反对

使用道具 举报

2

主题

9

回帖

32

积分

新手上路

Rank: 1

积分
32
 楼主| 发表于 2012-1-15 23:10:31 | 显示全部楼层

= (SELECT floor(RAND() * (SELECT MAX(itemid) FROM `destoon_know`)))&order=itemid desc&pagesize=10")}-->

这个语句是可以执行的,不过出来的结果是ID最高的10个记录
下面这个语句执行不出来

= (SELECT floor( RAND() * ((SELECT MAX(itemid) FROM `destoon_know`)-(SELECT MIN

(itemid) FROM `destoon_know`)) + (SELECT MIN(itemid) FROM `destoon_know`)))&order=itemid desc&pagesize=10")}-->
回复 支持 反对

使用道具 举报

15

主题

100

回帖

275

积分

中级会员

Rank: 3Rank: 3

积分
275
发表于 2012-1-16 08:46:05 | 显示全部楼层

顶一个!!!!!!!!!!!
回复 支持 反对

使用道具 举报

1

主题

2

回帖

13

积分

新手上路

Rank: 1

积分
13
发表于 2013-2-7 15:20:13 | 显示全部楼层

怎么没人解决呢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|destoon采集论坛

GMT+8, 2025-12-17 23:11 , Processed in 0.022308 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表