2011-03-08 9 views
0

UPDATE : 추가 실행되는 쿼리는 두 번째 :이 쿼리는 어떤 MySQL 인덱스에서 유익합니까?

(고려하여 인덱스를 찍을 때 어쩌면 필요 ???)

SELECT m.time, m.message, m.receiver_uid AS receiver, m.sender_uid AS sender 
    FROM messages AS m, users AS u 
    WHERE u.uid = '$coID' 
     AND ((m.receiver_uid = '$meID' AND m.sender_uid = '$coID') OR 
       (m.receiver_uid = '$coID' AND m.sender_uid = '$meID')) 
    ORDER BY m.time DESC 
  • $ MEID는 사용자의 ID입니다 누가 실행 wuery,
  • $ coID는 연락처의 ID입니다.

나는 다소 큰 쿼리를 있는데 그것은 사용자가 방문에게 매번 내 페이지를 실행합니다. (

LAST MESSAGE from EVERY 'CONVERSATION' ordered by TIME. 

는 그래서 마지막 메시지가 나타납니다

SELECT m2.message, m2.time, m2.sender_uid AS sender, m2.receiver_uid AS receiver, 
     m.contact, u.ufirstname 
FROM ( SELECT CASE 
       WHEN sender_uid = '$me' THEN receiver_uid 
       ELSE sender_uid 
       END AS contact, 
       MAX(time) AS maxtime 
     FROM messages 
     WHERE sender_uid = '$me' OR receiver_uid = '$me' 
     GROUP BY CASE 
       WHEN sender_uid = '$me' THEN receiver_uid 
       ELSE sender_uid 
       END          ) AS m 
INNER JOIN messages m2 ON m.maxtime = m2.time 
AND ((m2.sender_uid = '$me' AND m2.receiver_uid = m.Contact) 
OR (m2.receiver_uid = '$me' AND m2.sender_uid = m.Contact)) 
INNER JOIN users AS u ON m.contact = u.uid 
ORDER BY time DESC 

이 쿼리는 (성공적으로) 검색합니다 쿼리를 실행하는 사용자의 ID입니다 $ 모든 PM 세션에서 메시지를 보내거나 받겠는지) 시간별로 정렬하고 연락처 정보를 검색합니다.

정확하게 설명하지 않았다면 알려주십시오.

내 MySQL의 테이블은 다음과 같습니다

receiver_id | sender_id | message | time 

무엇 지수 (들) 것이 쿼리 혜택에서?

빅 쿼리 :

하는 출력을 EXPLAIN

은 (조인 부분은 연락처 이름 효율적이어야한다 검색 있도록 사용자 테이블은 이미 ID에 대한 기본 키가)

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 PRIMARY  <derived2> ALL  NULL NULL NULL NULL 4 Using temporary; Using filesort 
1 PRIMARY  m2 ALL  NULL NULL NULL NULL 42 Using where 
1 PRIMARY  u eq_ref PRIMARY  PRIMARY  4 m.contact 1 Using where 
2 DERIVED  messages ALL  NULL NULL NULL NULL 42 Using where; Using temporary; Using filesort 

업데이트 부분에 쿼리 :

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE u const PRIMARY  PRIMARY  4 const 1 Using index; Using filesort 
1 SIMPLE m ALL  NULL NULL NULL NULL 42 Using where 

답변

0

시간을 인덱싱하면로드 시간이 줄어 듭니다. 아마도 내 질문에 대한 답변 일 것입니다.

0

메시지 테이블이 커질수록이 쿼리는 더 느리게 시작됩니다. 사용자가 참여하는 대화의 수에 따라 기하 급수적으로 감소하는 성능을 보게됩니다. messages.time, messages.sender_uid 및 messages.receiver_uid의 개별 색인이 현재 도움이되지만 메시지 표를 정리하지 않으면 장기 실행에 도움이되는 색인이 없습니다. 특히 수십만 개 이상의 메시지가있는 경우 특히 그렇습니다.

사용자를 대화와 마지막 메시지 ID에 연결하는 연관 유형 유형을 유지하는 것이 좋습니다.다음과 같이 보이는 것 :

user_id | conversation_id | message_id

그런 다음 복잡하고 값 비싼 쿼리를 수행하는 대신이 테이블을 조회합니다. 이렇게하면 메시지 테이블에서 수행해야하는 검사 횟수가 크게 줄어 듭니다. 그러나 약간 복잡성이 증가하지만 성능은 위의 쿼리만큼 저하되지 않습니다.

+0

이전 (14 일) 메시지를 이전 테이블로 옮기는 방법은 무엇입니까? 사용자가 오래된 메시지를 정말로 읽고 싶을 때만 긴 테이블을 검색해야합니다. – SuperSpy

관련 문제