2012-04-25 3 views
3

MySQL 5.5를 사용 중입니다. 하위 쿼리를 사용하는 쿼리 (fulltext)가 있습니다. 성능 및 페이지 매김을 사용한다는 사실을 돕기 위해 LIMIT을 사용하여 결과의 ​​수를 제한하고 있습니다.개수 최적화 및 쿼리 선택

SELECT * 
FROM ( 
    SELECT id, type, type_id, content, MATCH(content) AGAINST('john') as relevance, IFNULL (parent_type, UUID()) as parent_type, IFNULL(parent_id, UUID()) as parent_id 
    FROM search_index 
    WHERE MATCH(content) AGAINST('john*' IN BOOLEAN MODE) GROUP BY parent_type, parent_id) as search 
GROUP BY search.type, search.type_id DESC LIMIT 10; 

그 외에도 가능한 모든 결과 (예 : 50000)를 각 검색어와 함께 보내야합니다. 카운트를 얻으려면 다음을 사용합니다.

SELECT COUNT(*) FROM(
    SELECT * 
    FROM ( 
     SELECT id, type, type_id, content, MATCH(content) AGAINST('john') as relevance, IFNULL (parent_type, UUID()) as parent_type, IFNULL(parent_id, UUID()) as parent_id 
     FROM search_index 
     WHERE MATCH(content) AGAINST('john*' IN BOOLEAN MODE) GROUP BY parent_type, parent_id) as search 
    GROUP BY search.type, search.type_id) as count; 

이렇게하면 다소 불편합니다. 다음은이 카운트 쿼리에 대한 설명입니다 :

enter image description here

search_indexcontent에 전체 텍스트 인덱스입니다. search_index_no_ftcontentid을 제외한 모든 열에 대한 색인입니다. id에 기본 키가 있습니다.

이렇게하는 것이 더 좋은 방법일까요? 아마도 이것을 최적화하는 방법일까요? 또는 2 개의 쿼리 (개수 및 검색)를 1로 결합하는 방법이 있습니까?

+0

정확한 일치 횟수가 필요합니까? Google에 대한 추정치 만 표시해야하는 이유가 있어야합니다. – piotrm

+0

대부분의 경우 작동하는 페이지 매김을 생성하기 위해 정확한 일치 항목 번호가 필요합니다 (예 : 사용자 목록 필터링 및 검색 등). 일반적인 사이트 링크 인 경우, 데이터 검색 량이 너무 많아서 사용자가 어쨌든 모든 데이터를 처리하지 못한다면 나는 예상치에 만족합니다. 그렇습니다. 유스 케이스와 정확히 일치해야합니다. – F21

+0

일부 사용자는 어쨌든 그렇게 할 수있게하려고 시도 할 것입니다. 한도에 기반한 페이지 매김이있는 웹 사이트에서 가장 높은 오프셋을 악용하는 것은 일반적인 공격 유형입니다. – piotrm

답변

0

SQL_CALC_FOUND_ROWS를 사용하려고 했습니까? 다음과 같이 작동합니다 :

SELECT SQL_CALC_FOUND_ROWS some_fields FROM table WHERE xxx LIMIT 10; 
SELECT FOUND_ROWS(); 

유일한 제한은 첫 번째 쿼리 바로 다음에 두 번째 쿼리를 실행해야한다는 것입니다.
mysql의 다른 문서 더보기 : http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows
동시성 쿼리에서 어떻게 동작하는지 모르기 때문에이를 확인해야합니다.

+0

미안하지만, 나는 단지 내가 나의 quesiton에서 치명적인 실수를했다는 것을 깨달았다. LIMIT에 의해 설정된대로 검색 가능한 행의 전체 개수와 행의 하위 집합을 반환해야합니다. 내가 원하는 결과는 검색 엔진과 유사합니다 : '10000 개의 가능한 결과 중 10 개 표시'와 처음 10 개의 결과 등 (사용자가 어떤 페이지에 있는지에 따라 다름) – F21