首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rand()更快的mysql php函数

问rand()更快的mysql php函数
EN

Stack Overflow用户
提问于 2010-07-24 05:48:00
回答 3查看 1.1K关注 0票数 1

如何随机选择墙纸,但最后选择的墙纸缓存10秒(出于性能原因)?

更快的RAND()函数在墙纸或图像中使用缓存我使用了这个,但我需要在图像中缓存1分钟或5分钟后及时更改以更改RAND()随机壁纸中的图像

我使用的是:

代码语言:javascript
复制
$sql_wallpaper = "SELECT SQL_CACHE * FROM `wallpaper` 
                  WHERE wallpaperid >= 
                  (SELECT FLOOR( MAX(wallpaperid) * RAND()) FROM `wallpaper` ) 
                  ORDER BY wallpaperid LIMIT 0,7";

但我认为它不会更快。它没有使用缓存

EN

回答 3

Stack Overflow用户

发布于 2010-07-24 06:45:24

a)如果查询包含RAND(),则将忽略SQL_CACHE!

b)您需要将您的随机id保存在某个地方,例如数据库或apc用户数据中。如果使用数据库,您将需要保存一个时间戳,这表示此id已经在使用中,因此您可以每5分钟更改一次。如果使用梯子,只需指定ttl为5分钟。

票数 2
EN

Stack Overflow用户

发布于 2010-07-24 21:31:38

假设PDO和Memcached:

代码语言:javascript
复制
 $pdo; //is the PDO database instance;
 $memcached;//is the memcached instance;

 function _getThe7Wallpapers(){
      global $memcached;
      $cached = $memcached->get('my7wallpapers');
      if($cached!==false) return $cached;
      global $pdo;
      $pdo->query('SELECT COUNT(*) FROM d INTO @count;');
      $pdo->query('SET @stmt = CONCAT(\'SELECT * FROM d ORDER BY id LIMIT \',ROUND(RAND()*GREATEST(@count-7,0)),\',7\');');
      $pdo->query('PREPARE rander FROM @stmt;');
      $rows = $pdo->query('EXECUTE rander;')->fetchAll(PDO::FETCH_ASSOC);
      $memcached->set('my7wallpapers',$rows,300);//cache for 5 minutes
      return $rows;
 }

如何实际设置PDO实例(或其他db-lib)和memcached可以在优秀的文档中阅读,因此我将把它留给您作为练习。

票数 1
EN

Stack Overflow用户

发布于 2010-07-24 21:37:07

只需在sql - SELECT * FROM wallpaper ORDER BY RAND() LIMIT 0,7中使用ORDER BY RAND(),然后使用其他答案中描述的任何方法在PHP端缓存结果X次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3322646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档