2013-07-20 4 views
0

중첩 된 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이 쿼리의 개별 부분의 결과를 캐시 할 수 있습니까?

답변

0

mysql을 사용하는 것 같습니다. 따라서 'SELECT * FROM tableC WHERE user_id = 1'쿼리를 처음 실행하면 '1,2,3,4,5'결과를 얻고 쿼리는 쿼리 캐시로 이동합니다. 따라서 두 번째 실행 후 시간 실행은 첫 번째 실행보다 짧습니다. 이 경우 결과는 첫 번째 쿼리와 관련됩니다. 두 번째 쿼리를 실행하면 서버에서 아무 것도 알지 못합니다. 그래서 그것을 실행하고 뭔가를 반환합니다 (귀하의 경우에는 결과가 동일합니다). 다음 번에 두 번째 쿼리를 실행할 때 쿼리 캐시에서 가져올 것이고 상당히 빨라질 것입니다. 어쨌든 서버는 쿼리 캐시에 두 개의 다른 레코드를 저장합니다.

+0

'SELECT * FROM tableB WHERE x IN (..)'쿼리의이 부분은 어떻게됩니까? 결과는 user_id = 1 또는 2 일 때와 같습니다. 그러나 쿼리의 실행 시간은 캐시가 사용되지 않음을 나타냅니다. – user1063998

+0

쿼리 캐시는 다음과 같은 방식으로 작동합니다. 1. 쿼리를 가져 와서 해시를 만듭니다. 2. 캐시 된 결과가 있는지 확인하십시오. 3. yes이면 캐시에 저장하지 않고 반환합니다. 귀하의 경우 두 가지 다른 해시를 제공 할 것입니다. 왜냐하면 쿼리가 다르므로 어떤 결과가 반환 되든 상관 없기 때문입니다. –

+0

고마워요 Andrej. 솔루션은 더 큰 쿼리를 두 개의 작은 쿼리로 분할하는 것입니다. 그렇게하면 가능한 경우 계산 상 비싼 것을 다시 실행할 필요가 없습니다. – user1063998