답변:
views 또는 db_query ()를 사용하면 캐싱이 중요하지 않습니다. 캐싱은 항상 동일하게 작동하며, 캐시 미스가 완전 할 때 데이터를 가져 오는 방법에 달려 있습니다.
몇 가지 예를 보려면 cache_get ()을 사용 하는 함수 ( 예 : variable_initialize ())를 볼 수 있습니다.
함수가 여러 번 호출 된 경우이를 정적 캐시와 결합하려고 할 수 있습니다 ( 예 : archiver_get_info () 참조 ) . 그리고 데이터 재구성이 실제로 느린 경우 variable_initialize ()와 같이 잠금 프레임 워크를 사용하여 여러 번 발생하는 것을 방지 할 수 있습니다.
cache_get ()도 Memcache와 같은 대체 캐시 백엔드를 사용하지 않는 한 db 쿼리이기 때문에 단일 쿼리 캐싱은 느린 쿼리 인 경우에만 의미가 있습니다.
마지막으로 Views에는 캐싱이 이미 내장되어 있으며보기에서 구성 할 수 있습니다. 옵션이기도합니다.
db_query()
,과에서 값을 캐시 할 필요 $results->fetchAll()
가 아닌 것은 $results
실제로 작업에 얻는 열쇠입니다.
DB 레이어에는 캐싱 메커니즘이 내장되어 있다고 생각하지 않지만 (잘못되었을 수도 있지만) 기본 캐시 API를 사용할 수 있습니다.
다음은 특정 유형의 노드를 얻기 위해 쿼리 결과를 캐시하는 기본 예제입니다.
function MYMODULE_get_nodes_by_type($type) {
// Setup a cache ID
$cid = 'MYMODULE:node_types:' . $type;
// If a cached entry exists, return it
if ($cached = cache_get($cid)) {
return $cached->data;
}
// Otherwise load the data
$data = db_query('SELECT * FROM {node} WHERE type = :type', array(':type' => $type))->fetchAll();
// And cache it
cache_set($cid, $data, 'cache', strtotime('+6 days'));
}
Drupal이 제공 하는 표준 cache_set / cache_get 메커니즘 외에도 MySQL을 데이터베이스로 사용하는 경우 뷰 또는 다른 데이터베이스 쿼리의 결과를 투명하게 캐시 할 수있는 쿼리 캐시를 활성화 할 수 있습니다 . mysqltuner 는 캐시 크기에 대한 좋은 값을 찾는 데 도움을 줄 수 있습니다.
데이터베이스에 많은 양의 쓰기 작업을 수행하는 경우 캐시 무효화 전략의 작동 방식으로 인해 쿼리 캐싱의 효율성이 떨어집니다 (테이블에 쓰면 SELECT FROM 또는 해당 테이블에 참여하는 모든 항목이 무효화 됨).
PostgreSQL 에 대한 캐싱 메커니즘 도 있지만 직접 경험이 없습니다.