2012-06-28 4 views
1

두 테이블 중 하나는 등급에 ID를 일치시키고 그 중 하나는 약 15 열에 실제 데이터가있는 ID를가집니다. 데이터 테이블에서 id 열에는 인덱스가 있고 등급 테이블에는 id가 기본 키이며 등급이 인덱싱됩니다. 긍정적 인 평가를받은 행에서만 데이터를 선택하고 싶습니다. 그래서 쿼리MYSQL 더 빠른 쿼리가 필요합니다

SELECT * FROM data_table 
    INNER JOIN rating_table ON data_table.id = rating_table.id 
    WHERE rating > 0 

하지만 어떤 이유로이 나에게 긴 매우 보인다 약 0.35 초 걸리는을 사용하고해야 할 일. 데이터 테이블에는 약 90,000 개의 행이 있고 등급 테이블에는 약 5,000 개의 행이 있습니다.이 작업은 10 분의 1 초보다 훨씬 짧아야합니다 ...이 작업을 빠르게 수행하려면 어떻게 다르게 인덱싱하거나 다르게 쿼리 할 수 ​​있습니까?

편집 : 프로파일 링 후 프로파일 링을 통해 다음과 같은 결과를 얻었습니다. 내가 쿼리가 다시 훨씬 빠르게 이전보다하지만, 그럼에도 불구하고이

0.000012 starting 
0.000053 checking query cache for query  
0.000014 Opening tables  
0.000006 System lock  
0.000027 Table lock  
0.000044 init 
0.000018 optimizing  
0.000060 statistics  
0.000016 preparing 
0.000004 executing 
0.004916 Sending data 
0.000007 end  
0.000003 query end 
0.002271 freeing items 
0.000009 storing result in query cache 
0.000002 logging slow query  
0.000004 cleaning up  

그래서 나는 많은 시간이 데이터 전송에 소요 된 볼 사람에게 유용 할 수 있습니다 온 있도록 캐시이라고 생각합니다 ... 어떻게 나는이 부분을 빠르게 할까?

+2

세 가지 질문 : 1) 동일한 데이터 유형의'data_table.id'와'rating_table.id'입니까? 2)'id' 필드를 인덱싱하는 것 외에'rating'도 인덱싱 했습니까? 3) 지속 시간이 다른 것 (예 : 클라이언트로 데이터를 보내는 것)으로 인해 발생하지 않는지 알아 내기 위해 명세서를 프로파일 링 했습니까? – Bjoern

+0

색인 만들기. 쿼리 응답 시간이 크게 향상됩니다. –

+0

네 등급에 이미 색인이 있고 두 테이블의 ID가 동일한 데이터 유형으로되어 있다고 대답했습니다. 나는 PHP mysadmin에서 지금 실행하고 있으므로 실제로 mysql에서 시간을 보낸다. 또한 쿼리 계획에서 무엇을 의미합니까? – hackartist

답변

3

정확한 해결책은 없지만 실제 테이블 구조를 보지 않고 조언하십시오. 쿼리를 올바르게 프로파일하십시오.

MySQL에는 inbuild 프로파일 러가 있습니다.이 프로파일러를 사용하면 얼마나 많은 시간을 소비했는지 쿼리의 어느 부분에 대해 매우 자세하게 볼 수 있습니다. 귀하의 경우에는

다음 단계를 따르십시오

(1) 쿼리를 실행합니다.

(2) 프로파일에 대한 쿼리 ID를 알아보십시오 :

SHOW PROFILES; 

그것은 이런 식으로 뭔가를 반환합니다

Query_ID | Duration | Query 
---------+-----------+----------------------- 
    2  | 0.0006200 | SHOW STATUS 
    3  | 0.3600000 | (your query here) 
    ... | ...  | ... 

이제 쿼리 ID (3) 알고있다.

(3) 쿼리를 프로파일 링하십시오.

SHOW PROFILE FOR QUERY 3; // example 

이 다음과 같을 수있는, 당신에게 세부 사항을 반환합니다

Status       | Duration 
--------------------------------+------------------- 
starting      | 0.000010 
checking query cache for query | 0.000078 
Opening tables     | 0.000051 
System lock      | 0.000003 
Table lock      | 0.000008 
init       | 0.000036 
optimizing      | 0.000020 
statistics      | 0.000013 
preparing      | 0.000015 
Creating tmp table    | 0.000028 
executing      | 0.000602 
Copying to tmp table   | 0.000176 
Sorting result     | 0.000043 
Sending data     | 0.080032 
end        | 0.000004 
removing tmp table    | 0.000024 
end        | 0.000006 
query end      | 0.000003 
freeing items     | 0.000148 
removing tmp table    | 0.000019 
closing tables     | 0.000005 
logging slow query    | 0.000003 
cleaning up      | 0.000004 

을이 예에서 대부분의 시간은 실제로 다시 서버에서 클라이언트로 데이터를 전송 지출했다.

이 작업을 완료했다면 질문을 업데이트하여 결과를 표시하십시오. 그리고 아마도 데이터 구조를 추가 할 수도 있습니다.

+0

ok 나는 방금 결과를 게시했지만 이번에는 캐시가 훨씬 빨리 돌아 왔기 때문에 캐시 된 것 같습니다. 여전히 유용 할 수 있습니다. 이 기능에 대해 알려 주셔서 감사드립니다. 이전에는 프로파일 러를 사용 해본 적이 없었습니다. – hackartist

+0

쿼리를 실행하기 전에 쿼리 캐시를 다시 설정하십시오. 그렇지 않으면 캐시에서 데이터를받은 데이터 만 표시됩니다. 'RESET QUERY CACHE;' – Bjoern

+2

@hackartist, '데이터 보내기'는 실제로 매우 기만적입니다. 클라이언트에게 데이터를 보내는 데 소요되는 시간 만이 아닙니다. 첫 번째 행을 읽은 후 마지막 행을 클라이언트에 전송할 때까지의 시간입니다. 즉, 클라이언트 **로 데이터를 보내는 데 소요 된 시간은 ** 그 값의 1 % 미만일 수 있습니다. – Adi

관련 문제