2012-04-07 5 views
1

pdo를 기반으로하는 데이터베이스 클래스에서 작업하고 있습니다. 사용되는 데이터베이스는 mysql 데이터베이스이지만 더 많은 성능을 얻기 위해 데이터베이스를 캐시하고 싶습니다. SQlite in-memory 데이터베이스에 데이터베이스를 캐싱하고 SELECT를 사용하여 INSERT, UPDATE, ... DB에서 db를 업데이트하는 것이 좋습니다. 하지만, "cache = new PDO ('sqlite : memory');라고 쓰면 새로운 캐시가 생성됩니까? 아니면 기존 데이터베이스를 사용합니까? 또한 한 서버에서 여러 웹 사이트를 호스팅하는 경우 다른 메모리 내 데이터베이스를 어떻게 사용할 수 있습니까?PHP : 데이터베이스 캐시 (sqlite 메모리 내장)

+1

당신은 mysql에 메모리 엔진이 있다는 것을 알지? –

+1

하지만 SQlite는 로컬이고 mysql은 원격 (-> slow) 일 수 있습니다. – joschua011

답변

2

각 SQLite 메모리 내 데이터베이스는 연결에 따라 다릅니다. 에 대한 두 개의 연결을 열어도 동일한 프로세스 내에서 메모리 :을 열어도 두 개의 서로 다른 인 메모리 데이터베이스가 만들어집니다. 따라서 새로운 데이터베이스는 항상 생성되며 기존 데이터베이스를 사용하지 않습니다.

올바른 이름을 사용하여 메모리 내장 데이터베이스를 만드는 데주의하십시오. 메모리 : 이외의 다른 이름 (같은 : memorry : 또는 메모리 또는 /: 메모리 :가) 실제로 메모리 데이터베이스하지만 일반 파일 기반 데이터베이스를 작성하지 않습니다. 이것은 조용히 일어난다.

제안 된 캐싱으로 얻게 될 성능 향상 효과는 작습니다. MySQL에서 선택을하고 컴퓨터에 충분한 메모리가 있으면 OS 디스크 버퍼링으로 인해 데이터가 이미 RAM에있을 수 있습니다. 그래서 SQLite in-memory 데이터베이스의 형태로 RAM의 또 다른 레이어를 추가하는 것은별로 도움이되지 않습니다.

시스템이 읽기 전용이 아닌 경우 제안 된 캐싱은 복잡하거나 잘못된 캐싱 논리로 쉽게 이어집니다. 일부 프로세스가 데이터 업데이트를 수행하는 경우 캐시를 업데이트하고 MySQL 데이터베이스를 업데이트해야하며 캐시가 더 이상 유효하지 않으며 다른 프로세스에서 MySQL의 데이터를 읽어야한다고 알리는 메커니즘을 만들어야합니다. 그렇지 않으면 데이터가 곧 엉망이됩니다. 두 프로세스가 동일한 데이터를 같은 시간에 다른 값으로 업데이트하기로 결정할 때 어떤 일이 벌어 지는지 생각해보십시오. 너는 갈등이있다.

더 많은 성능을 얻으려면 먼저 서버와 MySQL을 조정해야합니다. 충분하지 않은 경우 Memcached와 같은 캐시를 추가합니다. 이는 응용 프로그램 프로세스가 아닌 별도의 프로세스입니다. 그렇더라도 데이터가 업데이트시 일관성있게 유지되는 방식으로 응용 프로그램 논리를 작성하는 데주의해야합니다. MySQL만을 사용하고 InnoDB와의 트랜잭션을 올바르게 수행하면 MySQL이 대신 해줍니다.

관련 문제