4m 이상의 행을 기록한 채팅 메시지 테이블이 있습니다.대용량 테이블에서 기간 검색 최적화
특정 날짜 범위 내에서 사용자와주고받은 메시지를 가져와야합니다.
처음에는이 쿼리가 좋았지 만 테이블의 현재 크기가 너무 길어서 (> 10 초).
많은 조합의 인덱스를 만들려고했습니다. MySQL은 messageType + sentDate에 복합 인덱스를 사용합니다.
SELECT `ofMessageArchive`.*
FROM `ofMessageArchive`
WHERE `ofMessageArchive`.`messageType` IN ('Message')
AND (ofMessageArchive.fromJID = '[email protected]' OR ofMessageArchive.toJID = '[email protected]')
AND (ofMessageArchive.sentDate > '1462235333109')
ORDER BY ofMessageArchive.sentDate ASC LIMIT 50
이 쿼리를 어떻게 최적화 할 수 있습니까?
[편집] EXPLAIN
결과 :
+----+-------------+------------------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------+---------+-------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------+---------+-------+--------+-------------+
| 1 | SIMPLE | ofMessageArchive | ref | index_ofMessageArchive_on_fromJID_and_toJID,index_ofMessageArchive_on_sentDate,index_ofMessageArchive_on_messageType,idxMessageTypeSentDate,ofMessageArchive_fromjid_idx,ofMessageArchive_tojid_idx | idxMessageTypeSentDate | 767 | const | 731570 | Using where |
+----+-------------+------------------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------+---------+-------+--------+-------------+
'추가 된 결과를 설명하는이 쿼리 –
의 EXPLAIN' 결과를 제공하십시오 :
이 인덱스를 사용하려면union
사용 – Paludis