Кеширование SQL-запросов в Yii
11 февраля 2011
Сегодня Qiang реализовал ещё одну интересную штуку для Yii: кеширование запросов к базе данных на всех уровнях от DAO до ActiveRecord.
$sql = 'SELECT * FROM tbl_post LIMIT 20'; // кешируем результат запроса 1000 секунд $rows = Yii::app()->db->cache(1000)->createCommand($sql)->queryAll();
Если данные в таблице меняются, можно попробовать инвалидировать кеш, используя менее затратный запрос:
$sql = 'SELECT * FROM tbl_post LIMIT 20'; // сбрасываем кеш, если результат изменился $dependency = new CDbCacheDependency('SELECT MAX(update_time) FROM tbl_post'); // кешируем на 1000 секунд $rows = Yii::app()->db->cache(1000, $dependency)->createCommand($sql)->queryAll();
С AR это работает так:
$posts = Post::model()->cache(1000)->findAll(); $posts = Post::model()->cache(1000)->with('author')->findAll();
Опробовать можно, забрав код из SVN. Войдёт в релиз 1.1.7.
Комментарии RSS по email OK
А sql в CActiveDataProvider как закэшировать?
Уау, я тока хотел писать костыль для этого ) Ребята, вы лучшие. doctrina уже отдыхает. :)
Ncs,
Sam, а ты не знаешь как закэшировать запрос так чтоб он был в кэше только для этой страницы ? К примеру в примеру про RBAC :
Тем самым хочу избавиться от: private $_model;
По-моему,
private $_model
в этом случае логичней.В этом - да, но, есть и другие. Так что вопрос все еще актуален. Сталкивался пару раз с подобной задачей, но, пример не припомню уже.
Т.е., при соответствующем конфиге, конструкция
будет использовать memcached? проверка на наличие кеша будет автоматом делаться? просто из гайда не очень понятно.
Павел, да и да.
Ekstazi, я бы решил, передав в
cache
вторым параметром что-то вродеCGlobalStateCacheDependency
илиCExpressionDependency
.Все это замечательно. но почему в логах при выполнении данного кода :
нет записи, что данные по запросу берутся из кэша, как например такое :
вместо такого, выдается обычный запрос типа :
такое чувство, что запрос не кэшируется совсем никак.
а есть такая штука, чтобы в ходе выполнения приложения (допустим там одни селекты) запрос выполнившись один раз, больше не выполнялся, а его данные брались бы из временного кэша? А то SHOW CREATE TABLE выполняется каждый раз при инициализации модели например
Есть. В руководстве описано.
А в CSqlDataProvider есть cache?
Видимо так new CSqlDataProvider($sql, array('params'=>$params, 'db'=>Yii::app()->db->cache(1000))); ?
А можно закешировать само соединение? например : $connect = new CDbConnection('mysql:host=localhost;dbname=test','root','root'); У меня почему то не получается
В каком смысле закешировать соединение?
А почему при кэшировании запроса с параметрами вылетает ошибка ? Пример:
Без кэширования все работает прекрасно, с кешем имеем ошибку: