2009-10-22 3 views
4

우선, 내가 운영하는 웹 사이트가 호스팅되며 memcached와 같은 흥미로운 것을 설치할 수있는 권한이 없습니다.더 나은 성능을 위해 캐싱 테이블 결과 ... 어떻게?

HTML 테이블을 표시하는 웹 페이지가 여러 개 있습니다. 이러한 HTML 테이블의 데이터는 값 비싸고 복잡한 MySQL 쿼리를 사용하여 생성됩니다. 가능한 한 쿼리를 최적화하고 성능을 향상시키기 위해 인덱스를 제자리에 두었습니다. 문제는 MySQL 서버가 망가져서 고생하는 내 사이트로의 트래픽이 많은 경우입니다.

흥미롭게도 - MySQL 테이블 내의 데이터는 자주 변경되지 않습니다. 실제로 그것은 몇 주에 한 번 일어나는 어떤 특정한 사건 후에 만 ​​바뀝니다.

그래서 내가 지금했던 것은 이것이다 :

  1. 저장하면 URL이 파일 인 경우는
  2. 을 존재하는 경우 저장된 파일을 확인 액세스되는 파일
  3. 에 생성 된 HTML 테이블 1 시간보다 오래 걸리면 쿼리를 실행하고 파일을 출력하지 않으면 새 파일을 저장합니다.

이렇게하면 대다수의 요청에 대해 페이지가 매우 빠르게로드되고 데이터는 최대 1 시간까지 오래 사용할 수 있습니다. 내 목적을 위해 이것은 나쁘지 않다.

데이터베이스에서 데이터가 변경되면 캐시 파일이 삭제되지 않도록 보장하는 것이 좋습니다. 이 일 수 있습니다. 테이블에 대한 변경 쿼리를 수행하고 캐시 파일을 제거하는 코드를 추가하는 모든 스크립트를 찾아야합니다. 그러나 이후의 모든 변경 사항도이 메커니즘을 처리해야하므로 희박합니다.

우아한 방법이 있나요?

바닐라 PHP와 MySQL (최근 버전) 이외에는 아무것도 가지고 있지 않습니다. memcached를 가지고 놀고 싶습니다만, 할 수 없습니다. 캐시 무효화 및 명명 것들 :

답변

6

네 - 정답입니다.

데이터베이스 추상화 계층이 있다면 (잘하면 가능할 것입니다.) 마지막으로 업데이트 된 항목에 대해 데이터베이스에서 필드를 유지 관리하고 추상화 계층의 단일 지점에서 해당 필드를 관리 할 수 ​​있습니다.

(의사) : 당신이 다시 쿼리를해야하는 경우 On any update set last_updated.value = Time.now()

그런 다음 실행시에 캐시 된 파일의 시간이 비교 확인합니다.

당신이 추상화 계층이없는 경우,이 작업을 수행 모든 SQL 업데이트 호출에 래퍼 함수를 ​​만들고, 항상 미래의 기능에 대한 래퍼 함수를 ​​사용합니다.

+0

추상화 레이어가 없습니다. 그러나 귀하의 게시물을 통해 데이터베이스의 모든 단일 테이블에 대해 자동 타임 스탬프를 사용하는 Updated 컬럼을 만들었습니다. 적어도 데이터의 신선도를 확인하고 이에 따라 캐시 파일을 삭제하는 간단한 쿼리를 할 수 있습니다. 찾고 있던 은색 총알이 아니지만 꽤 반짝입니다. – Vamos

+0

사실, 필자는 모든 추상화를 다루는 적어도 하나의 추상화 계층을 가지고있다. 쿼리가 UPDATE/INSERT/DELETE 중 하나인지 확인할 수 있습니다. 그렇다면 쿼리를 실행 한 후 관련 캐시 파일을 삭제할 수 있습니다. 훌륭하지는 않지만, 내가 원하는대로 견고 함을 이루어야합니다. – Vamos

7

는 컴퓨터 과학 단지 두 개의 하드 가지가 있습니다.

죄송합니다

- 필 Karlton은 큰 도움이되지 않지만, sooooo는 사실이다.

+0

도움이된다면, 검색 키워드를 내게주었습니다. – Vamos

+1

+1 전에는 들어 본 적이 없지만 집에 확실히 도착했습니다. – snicker

1

대부분의 내용을 다루었지만 last_modified 필드와 cron 작업이 도움이 될 수 있습니다.

MySQL에서 파일을 삭제할 방법이 없기 때문에 Postgres는 해당 기능을 제공하지만 MySQL은 삭제할 수 없습니다.

+0

Yep - last_modified 또는 내 경우 업데이트 된 열 (자동 업데이트)은 좋은 방법 인 것 같습니다. – Vamos

0

PHP의 output buffering functions을 사용하여 결과를 문자열로 캐싱 할 수 있습니다. Google it이 있으며 어떻게 완료되는지 웹 사이트에서 알 수 있습니다.

그러나 한 시간 후에 데이터가 만료된다는 것을 어떻게 알 수 있습니까? 아니면 지속적인 페이지 생성을 보장하기 위해 데이터가 60 분 내에 극적으로 변하지 않을 것이라고 가정하고 있습니까?

+0

60 분 제한은 무거운 작업을 수행하고 캐시 파일을 다시 작성하는 60 분마다 한 번의 요청 만한다는 것을 의미합니다. 그것은 임의적이었습니다. 캐시 파일을 다시 작성하는 대신 캐시 파일을 다시 작성하는 대신 데이터가 실제로 변경되었는지 여부와 캐시 파일의 타임 스탬프를 업데이트하지 않으면 새로운 것이 다시 표시되는지 확인할 수있었습니다. – Vamos

관련 문제