조건

2012-08-13 3 views
4

내 문제는 다음입니다 fulltextindex 등을 사용하여 효율적인 쿼리 도중 수행.
여기 조건

  • ID가 (BIGINT)
  • msgtimeutc (BIGINT)
  • 피사체 (tinytext)
  • 본체 (텍스트)
  • 다른 데이터가 표시 될

    이 테이블의 중요한 분야이다
    0 :

나는이 테이블에 전체 텍스트 인덱스가

SELECT M.some_data 
FROM mailmessage M 
WHERE M.MSGTIMEUTC >= 1343651965 AND M.MSGTIMEUTC <= 1344170365 
AND (MATCH (M.BODY,M.SUBJECT) AGAINST ('test')); 

MySQL의를

  • 2 개 인덱스를 사용할 수 없습니다

    :

    나는 몸과 주제의 텍스트를 검색과 같은 msgtimeutc에 날짜 시간에 의해 축소 요청 을 할 필요가 동시에 (msgtimeutc와 fulltextindex에있는 것). 그래서 내 질문은 그것이 BIGINT이기 때문에 나는 전체 텍스트 인덱스에 msgtimeutc을 포함 할 수 없습니다 msgtimeutc

  • 에 전체 테이블 스캔을하고 종료하고 나는 위 또는 아래에

그래서 쿼리가 복용 방법에 뭐하는 거지 너무 오랜 시간 (및 I/O)!

나는 (샘플 코드는 테스트하지)

SELECT M1.some_data FROM mailmessage M1 
WHERE M1.MSGTIMEUTC >= 1343651965 AND M1.MSGTIMEUTC <= 1344170365 
INTERSECT 
SELECT M2.some_data FROM mailmessage M2 
WHERE (MATCH (M2.BODY,M2.SUBJECT) AGAINST ('test')); 

(스크롤 죄송합니다) 설명과 같이 교 차 을하는 것에 대해 문질러서 :

+----+-------------+-------+----------+---------------------------------+----------------------+---------+------+------+-------------+ 
| id | select_type | table | type  | possible_keys     | key     | key_len | ref | rows | Extra  | 
+----+-------------+-------+----------+---------------------------------+----------------------+---------+------+------+-------------+ 
| 1 | SIMPLE  | M  | fulltext | msgtimeutc,mailmessage_fulltext | mailmessage_fulltext | 0  |  | 1 | Using where | 
+----+-------------+-------+----------+---------------------------------+----------------------+---------+------+------+-------------+ 

을하지만, MySQL의에 존재하지 않습니다

아래 2와 같은 기타 요청은 전체 테이블 스캔도 수행합니다.

SELECT M.some_data 
FROM mailmessage M 
WHERE 
M.id in ( 
    select m2.id from mailmessage m2 use index(mailmessage_fulltext) 
    where (MATCH (m2.BODY,m2.SUBJECT) AGAINST ('test')) 
) 
AND M.MSGTIMEUTC >= 1343651965 AND M.MSGTIMEUTC <= 1344170365; 

또는

SELECT M1.ATTACHMENTCOUNT AS ATCH_COUNT 
FROM mailmessage AS M1 
INNER JOIN mailmessage AS M2 ON M1.id = M2.id 
WHERE (M1.MSGTIMEUTC >= 1343651965 AND M1.MSGTIMEUTC <= 1344170365) 
AND (MATCH (M2.BODY,M2.SUBJECT) AGAINST ('test')) 

두 쿼리

나를 하나의 인덱스 사용 (전체 텍스트)

그래서 나는 날짜별로 programmaticaly 라인을 필터링 끝낼 수 있습니다 ...하지만 내가 선호하는 것 (관련 보여줍니다 계획을 설명 볼륨) 데이터베이스 솔루션

어떤 생각?

+0

첫 번째 검색어에 대해 'EXPLAIN' 결과를 표시 할 수 있습니까? – raina77ow

+0

첫 번째 쿼리에 대한 결과가 더 설명되어 있습니다. –

답변

1

최신 MySQL 버전부터는이 일부 다른

http://dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.html

인덱스 병합으로 전체 텍스트 인덱스를 결합 할 수있는 방법입니다 전체 텍스트 인덱스에 적용 할 수 없습니다. 향후 MySQL 릴리즈에서이를 커버 할 수 있도록 확장 할 계획입니다.

당신은 임시 테이블로 문제를 해결하려고 할 수 있습니다

:

SELECT M.some_data 
FROM my_search M 
WHERE (MATCH (M.BODY,M.SUBJECT) AGAINST ('test')); 

이 솔루션을, 마음에 계속

CREATE TEMPORARY TABLE my_search 
    (FULLTEXT INDEX mailmessage_fulltext(body,subject))   
SELECT M.some_data 
FROM mailmessage M 
WHERE M.MSGTIMEUTC >= 1343651965 AND M.MSGTIMEUTC <= 1344170365 

다음 쿼리와 일치, 전체 텍스트 색인 실제 테이블에서 완전히 쓸모 없게됩니다.

+0

감사합니다. 훌륭합니다. 두 가지 경우가 있습니다. 검색된 단어가 일반적이지 않은 경우 : 전체 텍스트가 빠르며 날짜별로 필터링하기 쉬운 몇 줄을 반환합니다 (MySQL 또는 Java) 검색된 단어가 공통적 인 경우 솔루션은 날짜별로 먼저 제한하는 것이 효과적입니다. 나는 (나는 일반적인 단어를 차단해야 할 수도 있습니다) 어떤 경우에 맞춰 해결책을 찾고 있습니다. –