MySQL은 쿼리를 캐시합니까?


19

MySQL 데이터베이스를 PHP 데이터 객체 (PDO)와 인터페이스하고 광범위한 SQL 쿼리를 실행하고 있습니다. 일반적으로 약 1500ms가 소요됩니다. 여전히 최적화해야합니다. 짧은 간격으로 PHP 스크립트를 두 번 실행하면 쿼리에 약 90ms가 걸립니다. 쿼리는 두 경우 모두 동일합니다. 동일한 쿼리로 스크립트를 실행하면 다시 한 번 1500ms가 걸립니다.

왜 그런 겁니까? 데이터베이스가 자동으로 캐시됩니까? 데이터베이스가 캐시를 저장 한 다음 자동으로 삭제하는 데 시간이 있습니까?

결과는 두 개의 다른 스레드에서 발생하기 때문에 PHP로 캐시 할 수 없다고 가정합니다. 데이터베이스가 변경되었는지 알 수 없기 때문에 PHP가 결과를 캐시하지 않을 것이라고 생각합니다.

데이터베이스에 새 행을 삽입하기 위해 매분마다 스크립트를 실행하고 있습니다. 이것은 또한 얼마 후에 1500ms가 다시 걸리는 이유 일 수도 있습니다. 관련 테이블이 더 이상 동일하지 않기 때문에 캐시가 삭제되었습니다.


코드를 보여주세요. 나는 당신이 그것을 어떻게 테스트하고 있는지 당신의 쿼리가 필요하지 않습니다.

3
예, mySQL은 쿼리를 캐시합니다. 그것은 영리합니다.

@ Kasyx 어떤 코드? 기본 PDO 일 뿐이지 만 PHP 스크립트를 두 번 실행하기 때문에 PHP가 캐시 할 수 있다고 생각하지 않으며 한 스크립트에서 쿼리를 두 번 실행하지 않습니다. 또한 pdo 가 실제로 질문과 관련이없는 동안 편집 한 이유를 설명 할 수 있습니까?

3
모든 DBMS에는 일종의 페이지 수준 캐시가 있습니다. 많은 사람들은 쿼리 실행 계획 또는 심지어 쿼리 결과 ( MySQL 포함 ) 를 캐싱함으로써 그 이상을 수행 합니다. 나는이 마지막 것이 당신의 관찰 된 행동의 주범이라고 생각합니다.
Branko Dimitrijevic

당신은 매분 삽입을하고 있습니까? 정렬 밖으로 첫번째!
그랜트 토마스

답변:


15

이것은 아마도 MySQL Query Cache 의 아티팩트 일 것입니다 .

SQL 쿼리를 실행하면 MySQL은 결과를 캐시하고 빠른 경우 다음 실행을 캐시합니다. 스크립트를 실행하여 쿼리에서 참조하는 테이블에 데이터를 삽입하면 결과 캐시가 무효화되고 다음에 "실제로"쿼리를 실행해야합니다.

위에 링크 된 MySQL 문서에서 :

거의 전체적으로 고정 된 SELECT 문 집합으로 구성된 쿼리 믹스는 INSERT 문이 빈번하게 캐시에서 결과가 계속 무효화되는 믹스보다 캐시를 ​​활성화하면 훨씬 유리합니다.


5

예, mySQL (다른 모든 인기있는 데이터베이스 제품과 공통)은 수행 된 쿼리를 캐시합니다.

캐싱은 매우 영리합니다. 쿼리의 정확한 매개 변수가 같지 않아도 쿼리에 캐시를 사용할 수 있습니다. 이것은 성능에 큰 차이를 만들 수 있습니다.

캐싱은 전적으로 DB 서버 소프트웨어 내에서 제어됩니다. 캐시에 포함 된 내용이나 캐시에 지정된 항목이 얼마나 오래 남아 있는지에 대한 가시성이 없습니다. 어떤 쿼리가 호출되는지 등에 따라 주어진 순간에 덮어 쓸 수 있습니다. 성능을 돕기 위해 존재하지만 성능에 의존해서는 안됩니다.

자세한 내용 은 MySQL 매뉴얼을 참조하십시오 .

또한 PDO를 사용하면 쿼리를 "준비된 명령문"으로 작성하여 매개 변수를 일반 텍스트 쿼리 문자열로 하드 코딩하는 대신 바인딩 할 수 있습니다. 이것은 또한 DB 서버에 캐싱 영향을 미치며 반복되는 쿼리에 대해서도 성능을 향상시킵니다.


2
"MySQL 5.1.17부터 쿼리 캐시는 8.6.3.1 절"쿼리 캐시 작동 방식 "에 설명 된 조건에 따라 준비된 명령문에 사용됩니다. 5.1.17 이전에는 쿼리 캐시가 준비된 명령문에 사용되지 않습니다." dev.mysql.com/doc/refman/5.1/en/query-cache.html

1
" 다른 모든 인기있는 데이터베이스 제품과 공통으로 ": 약간 오해의 소지가 있습니다. 어떤 DBMS도 MySQL과 같은 방식으로 쿼리 결과를 적극적으로 캐시 하지 않습니다. DBMS는 일반적으로 쿼리 결과가 아닌 테이블 (또는 인덱스) 데이터 만 캐시합니다 . 그들 대부분은 쿼리 실행 계획 (및 쿼리 "소스")을 캐시합니다.
a_horse_with_no_name

3
"쿼리의 정확한 매개 변수가 동일하지 않더라도 종종 쿼리에 캐시를 사용할 수 있습니다"는 완전히 잘못된 것입니다. 캐시에서 제공 되려면 쿼리가 이전에 실행되고 여전히 캐시 된 쿼리와 바이트 단위로 동일해야합니다. 동일하지 않은 쿼리 SELECT *와 의 차이점 select *은 캐시에서 제공되지 않습니다. dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html . 일관성을 위해 5.1 링크를 게시했지만 모든 버전에 적용됩니다.
Michael-sqlbot 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.