rand () быстрее MySQL PHP-функция - PullRequest
1 голос
/ 24 июля 2010

Как выбрать обои случайным образом, но кэшировать последний выбранный в течение 10 секунд (по соображениям производительности)?

чем быстрее функция RAND () использует Кэш в обоях или изображениях, которые я использую, но мне нужноно кеширование изображений своевременно меняется через 1 или 5 минут, чтобы изменить изображения в RAND () случайных обоях

я использую это:

$sql_wallpaper = "SELECT SQL_CACHE * FROM `wallpaper` 
                  WHERE wallpaperid >= 
                  (SELECT FLOOR( MAX(wallpaperid) * RAND()) FROM `wallpaper` ) 
                  ORDER BY wallpaperid LIMIT 0,7";

но я думаю, что это не быстрее ...не использует кеш

Ответы [ 3 ]

2 голосов
/ 24 июля 2010

a) SQL_CACHE будет игнорироваться, если запрос содержит RAND()!

б) Вам нужно будет где-нибудь сохранить свой случайный идентификатор, например, в базе данных или в пользовательских данных apc. Если вы используете базу данных, вам нужно сохранить с ней временную метку, которая обозначает, что с тех пор этот идентификатор уже используется, поэтому вы можете менять его каждые 5 минут. При использовании лестницы просто укажите ttl 5 минут.

1 голос
/ 24 июля 2010

Предполагается, что PDO и Memcached:

 $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 можно прочитать в отличной документации, так что я оставлю это на ваше усмотрение.

0 голосов
/ 24 июля 2010

просто ORDER BY RAND() в вашем sql - SELECT * FROM wallpaper ORDER BY RAND() LIMIT 0,7, затем кэшируйте результаты на стороне PHP в течение X раз, используя любой из описанных методов из других ответов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...