중첩 된 SELECT 문이 많은 큰 쿼리가 있습니다. 단순화 된 버전은 다음과 같습니다내부 쿼리의 MySQL 쿼리 캐싱
SELECT * FROM tableA WHERE x IN(
SELECT * FROM tableB WHERE x IN(
SELECT * FROM tableC WHERE user_id = y
)
)
결정적으로는, 가장 안쪽 문은 USER_ID보고 쿼리의 나머지 부분에 사용하는 ID 번호의 목록을 선택하여 시작합니다.
문제는 두 명의 사용자가 tableC에서 동일한 데이터를 가지고 있어도 나머지 쿼리가 캐시되지 않은 것입니다. 예를 들어
경우SELECT * FROM tableC WHERE user_id = 1
반환 (1,2,3,4,5) 및
SELECT * FROM tableC WHERE user_id = 2
도 반환 (1,2,3,4,5)
내가 가진 모든 쿼리를 실행하면 USER_ID = 1 실행 시간은 약 0.007 초입니다. 쿼리를 다시 실행하면 0.002의 실행 시간이 단축됩니다. user_id를 2로 변경하고 쿼리를 실행하면 쿼리가 처음 실행될 때 실행 시간이 0.007로 돌아갑니다. mySQL이 쿼리의 개별 부분의 결과를 캐시 할 수 있습니까?
'SELECT * FROM tableB WHERE x IN (..)'쿼리의이 부분은 어떻게됩니까? 결과는 user_id = 1 또는 2 일 때와 같습니다. 그러나 쿼리의 실행 시간은 캐시가 사용되지 않음을 나타냅니다. – user1063998
쿼리 캐시는 다음과 같은 방식으로 작동합니다. 1. 쿼리를 가져 와서 해시를 만듭니다. 2. 캐시 된 결과가 있는지 확인하십시오. 3. yes이면 캐시에 저장하지 않고 반환합니다. 귀하의 경우 두 가지 다른 해시를 제공 할 것입니다. 왜냐하면 쿼리가 다르므로 어떤 결과가 반환 되든 상관 없기 때문입니다. –
고마워요 Andrej. 솔루션은 더 큰 쿼리를 두 개의 작은 쿼리로 분할하는 것입니다. 그렇게하면 가능한 경우 계산 상 비싼 것을 다시 실행할 필요가 없습니다. – user1063998