2012-06-20 6 views
0

처음에는이 주제가 매우 일반적인 주제라고해야합니다. 나는 모든 관련 주제를 연구했지만 대답을 찾을 수 없습니다. 세 개의 테이블이 있습니다. 메시지 테이블에는 300.000, 태그 테이블에는 1 백만 개, message_tag 테이블에는 약 1,000 만 개의 행이 있습니다. message_tag.message_id 및 message_tag.tag_id 열에는 색인이 있습니다. 내 목적은 spesified 태그를 링크하는 선택 메시지입니다. 그러나 쿼리 시간이 너무 깁니다. 20 초보다 짧은 쿼리 시간은 없습니다. 반면에 가끔 쿼리는 긴 쿼리 시간 때문에 결과를 제공하지 않습니다. 테이블 구조와 내 쿼리는 아래와 같습니다. 이 문제를 어떻게 처리 할 수 ​​있습니까? 나는 모든 제안을 공개한다. 심지어 새 스키마로 테이블을 다시 만들 수 있습니다. 데이터베이스는 MySql이고 스토리지 모터는 MyIsam입니다. .MySQL의 쿼리 최적화

table name: messages 
columns : 
id (int) 
message (vharchar) 
message_poster (vharchar) 

table name: tags 
id (int) 
tag (vharchar) 

table name : message_tag 
columns : 
message_id (int) 
tag_id (int) 

내 쿼리 :

SELECT     messages.message_poster, 
          messages.message 
        FROM tags, messages, message_tag 
        WHERE message_tag.tag_id=191 
        AND messages.id= message_tag.message_id 
+0

모든 관련 주제를 읽었지만 거기에있는 "색인"에 대해 찾았습니까? 가지고있는 색인 (색인?)을 알려 주실 수 있으면 그렇게하십시오. D – Nanne

+1

'SHOW CREATE TABLE messages','SHOW CREATE TABLE tags' 및 'SHOW CREATE TABLE message_tag'의 출력을 제공하십시오. – RandomSeed

+0

어떻게 지내세요? 'tags' 테이블을 사용하고 있습니까? 그것은 from 목록에 있지만'select' 또는'where' 절에는 없습니다. –

답변

2

여기에 , 표기법을 사용하지 않는 이유의 예가 나와 있습니다.

message_tagtags과 연결시키지 마십시오. 대신, 다른 모든 행에 EVERY 메시지 태그를 참여시킵니다.

이것은 당신이 무엇을 ...

SELECT 
    messages.message_poster, 
    messages.message 
FROM 
    messages 
INNER JOIN 
    message_tag 
    ON messages.id= message_tag.message_id 
CROSS JOIN 
    tags 
WHERE 
    message_tag.tag_id=191 

SELECT 
    messages.message_poster, 
    messages.message 
FROM 
    messages 
INNER JOIN 
    message_tag 
    ON messages.id = message_tag.message_id 
INNER JOIN 
    tags 
    ON tags.id  = message_tag.tag_id 
WHERE 
    message_tag.tag_id = 191 

(또는 단지 tags에 가입하지 않습니다 ... 당신이 있어야하는 것입니다 이 경우에는 사용하지 않을 것입니다. 실제 쿼리의 단순화 된 버전 일 수 있습니다.

ANSI-92 표기법으로 처리하는 것이 훨씬 어렵습니다.

+0

+1 전체 쿼리를 다시 작성하는 경우 : p –

0

이 (두 필드 이상) message_tag에 두 개의 차원 인덱스를 작성하고 난 당신이 누락 있다고 생각

WHERE 
    message_tag.tag_id=191 AND 
    message_tag.message_id = messages.id 
0

에 WHERE를 다시 작성 2 테이블 사이에 조인 조건, tagsmessage_tag?