데이터베이스 캐싱 클래스¶
데이터베이스 캐싱 클래스를 사용하면 쿼리를 텍스트 파일로 캐시하여 데이터베이스 부하를 줄일 수 있습니다.
중요
이 클래스는 캐싱이 활성화되면 데이터베이스 드라이버에 의해 자동으로 초기화됩니다. 이 클래스를 수동으로 로드하지 마세요.
중요
캐싱을 사용할 때 모든 쿼리 결과 함수를 사용할 수 있는 것은 아닙니다. 이 페이지를 주의 깊게 읽어보세요.
캐싱 활성화¶
캐싱은 세 단계로 활성화됩니다:
서버에 캐시 파일을 저장할 수 있는 쓰기 가능한 디렉터리를 만드세요.
application/config/database.php 파일에서 캐시 폴더 경로를 설정하세요.
application/config/database.php 파일의 설정을 통해 전역으로 또는 아래에 설명된 대로 수동으로 캐싱 기능을 활성화하세요.
활성화되면 데이터베이스 쿼리가 포함된 페이지가 로드될 때마다 캐싱이 자동으로 수행됩니다.
캐싱은 어떻게 작동하나요?¶
CodeIgniter의 쿼리 캐싱 시스템은 페이지가 조회될 때 동적으로 작동합니다. 캐싱이 활성화되면 웹 페이지가 처음 로드될 때 쿼리 결과 오브젝트가 직렬화되어 서버의 텍스트 파일로 저장됩니다. 다음번에 페이지가 로드될 때는 데이터베이스에 접근하는 대신 캐시 파일이 사용됩니다. 캐시된 페이지의 경우 데이터베이스 사용을 사실상 0으로 줄일 수 있습니다.
읽기 유형(SELECT) 쿼리만 캐시될 수 있으며, 이는 결과를 생성하는 유일한 쿼리 유형이기 때문입니다. 쓰기 유형(INSERT, UPDATE 등) 쿼리는 결과를 생성하지 않으므로 시스템에 의해 캐시되지 않습니다.
캐시 파일은 만료되지 않습니다. 캐시된 모든 쿼리는 삭제할 때까지 캐시 상태로 유지됩니다. 캐싱 시스템을 통해 개별 페이지와 연관된 캐시를 지우거나 전체 캐시 파일 컬렉션을 삭제할 수 있습니다. 일반적으로 데이터베이스에 새 정보를 추가한 후와 같은 특정 이벤트 발생 후 캐시 파일을 삭제하기 위해 아래에 설명된 유지 관리 함수를 사용합니다.
캐싱이 사이트 성능을 향상시킬까요?¶
캐싱으로 인한 성능 향상은 많은 요인에 따라 달라집니다. 부하가 매우 낮은 최적화된 데이터베이스를 가지고 있다면 성능 향상을 경험하지 못할 수 있습니다. 데이터베이스가 많은 부하를 받고 있다면 파일 시스템이 과부하 상태가 아닌 경우 응답 시간이 개선될 것입니다. 캐싱은 단순히 정보를 검색하는 방법을 변경하여 데이터베이스 작업에서 파일 시스템 작업으로 전환한다는 점을 기억하세요.
예를 들어 클러스터 서버 환경에서는 파일 시스템 작업이 매우 집약적이기 때문에 캐싱이 오히려 해로울 수 있습니다. 공유 환경의 단일 서버에서는 캐싱이 유용할 것입니다. 안타깝게도 데이터베이스를 캐시해야 하는지에 대한 단일 답변은 없습니다. 이는 상황에 따라 다릅니다.
캐시 파일은 어떻게 저장되나요?¶
CodeIgniter는 각 쿼리의 결과를 별도의 캐시 파일에 배치합니다. 캐시 파일 세트는 컨트롤러 함수에 해당하는 하위 폴더로 추가로 구성됩니다. 정확히 말하면 하위 폴더의 이름은 URI의 처음 두 세그먼트(컨트롤러 클래스 이름과 함수 이름)와 동일합니다.
예를 들어 세 개의 쿼리가 포함된 comments라는 함수가 있는 blog라는 컨트롤러가 있다고 가정해 봅시다. 캐싱 시스템은 blog+comments라는 캐시 폴더를 만들고 세 개의 캐시 파일을 작성합니다.
URI의 정보에 따라 변경되는 동적 쿼리를 사용하는 경우(예: 페이지네이션 사용 시) 각 쿼리 인스턴스는 자체 캐시 파일을 생성합니다. 따라서 쿼리 수보다 훨씬 더 많은 캐시 파일이 생성될 수 있습니다.
캐시 파일 관리¶
캐시 파일은 만료되지 않으므로 애플리케이션에 삭제 루틴을 구축해야 합니다. 예를 들어 사용자 댓글을 허용하는 블로그가 있다고 가정해 봅시다. 새 댓글이 제출될 때마다 댓글을 제공하는 컨트롤러 함수와 연관된 캐시 파일을 삭제합니다. 데이터를 지우는 데 도움이 되는 두 가지 삭제 함수를 아래에서 확인할 수 있습니다.
캐싱에서 사용 불가 함수¶
마지막으로 캐시된 결과 오브젝트는 전체 결과 오브젝트의 단순화된 버전임을 알려드립니다. 그 이유로 일부 쿼리 결과 함수를 사용할 수 없습니다.
캐시된 결과 오브젝트를 사용할 때 다음 함수는 사용할 수 없습니다:
num_fields()
field_names()
field_data()
free_result()
또한 두 가지 데이터베이스 리소스(result_id와 conn_id)는 캐싱 시 사용할 수 없습니다. 결과 리소스는 런타임 작업에만 해당하기 때문입니다.
함수 레퍼런스¶
$this->db->cache_on() / $this->db->cache_off()¶
캐싱을 수동으로 활성화/비활성화합니다. 특정 쿼리를 캐시에서 제외하려는 경우 유용합니다. 예시:
// 캐싱 켜기
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM mytable");
// 이 쿼리에 대해 캐싱 끄기
$this->db->cache_off();
$query = $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'");
// 캐싱 다시 켜기
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM another_table");
$this->db->cache_delete()¶
특정 페이지와 연관된 캐시 파일을 삭제합니다. 데이터베이스를 업데이트한 후 캐싱을 지워야 할 때 유용합니다.
캐싱 시스템은 현재 보고 있는 페이지의 URI에 해당하는 폴더에 캐시 파일을 저장합니다. 예를 들어 example.com/index.php/blog/comments 페이지를 보고 있다면 캐싱 시스템은 관련된 모든 캐시 파일을 blog+comments라는 폴더에 넣습니다. 해당 캐시 파일을 삭제하려면 다음을 사용하세요:
$this->db->cache_delete('blog', 'comments');
매개변수를 사용하지 않으면 현재 URI가 지워야 할 항목을 결정하는 데 사용됩니다.
$this->db->cache_delete_all()¶
기존의 모든 캐시 파일을 지웁니다. 예시:
$this->db->cache_delete_all();