2017-04-04 17 views
2

다음 쿼리를 최적화 할 수있는 방법이 있습니까?카운트 w /가 값보다 큰 경우 MySQL 효율적인 테스트

SELECT count(*)>1000 FROM table_with_lot_of_rows WHERE condition_on_index; 

이 쿼리를 사용하여, MySQL은 먼저 count(*) 후 비교를 수행합니다. 이것은 조건을 만족하는 행이 몇 개 밖에 없을 때 빠르지 만 많은 행이 만족하면 영원히 걸릴 수 있습니다. 모든 결과를 거치지 않고 1000 개의 항목이 발견되는 즉시 계산을 중단 할 수있는 방법이 있습니까?

특히 전체 텍스트 조건의 MyISAM 테이블에 관심이 있지만 InnoDB 및/또는 기본 WHERE 절에 대한 모든 대답이 도움이 될 것입니다.

답변

4
SELECT 1 
    FROM table_with_lot_of_rows 
    WHERE condition_on_index 
    LIMIT 1000, 1; 

작품이 방법 :

  1. (아마도 더 빨리 데이터를 사용하는 것보다) 인덱스
  2. 아무것도를 수집하지 않습니다 1000 개 행을 건너을 사용. (다른 답변보다 낫습니다.)
  3. 멀리 만들면 리터럴 1 (SELECT) 만 포함 된 1 행을 가져옵니다.

이제 공백 결과 집합 (< = 1000 행) 또는 1 (1001 행 이상) 행이 있습니다.

그런 다음 응용 프로그램 언어에 따라 두 경우를 구분하기 쉽습니다.

또 다른 참고 :이 더 큰 쿼리의 하위 쿼리 할 경우,/TRUE FALSE를 반환

EXISTS (SELECT 1 
    FROM table_with_lot_of_rows 
    WHERE condition_on_index 
    LIMIT 1000, 1) 

할 (1 동의어 나되는 0).

얼굴이 1001 행을 검색하는 경우에도 인덱스가 시간이 걸립니다. 나는 나의 배합이 가능한 한 가장 빠름하다고 생각한다.

기타 확인할 사항 : InnoDB입니까? EXPLAIN에 "색인 사용"이 있습니까? 얼마나 많은 RAM 이요? innodb_buffer_pool_size의 설정은 무엇입니까?

이제 InnoDB에는 FULLTEXT가 있으므로 MyISAM을 사용할 이유가 없습니다.

당신이 MyISAM을 사용하고 있고 WHEREMATCH... 인 경우, 제가 말했던 대부분이 적용될 수 없을 것입니다. FULLTEXT은 아마도 나머지 엔진에 ORDER BYLIMIT으로이 게임을 할 수있는 기회를주기 전에 모든 결과를 가져옵니다.

실제 검색어 인 EXPLAINSHOW CREATE TABLE을 표시하십시오. 그리고 진짜 목표는 무엇입니까? 쿼리가 "너무 많은"결과를 제공하는지 확인하려면?

가능한 개선 내 초기 SELECT 반환 1 또는 NULL을 스칼라 때문에

(상황에 따라)는, 이러한 WHERE로 어떤 부울 컨텍스트에서 사용할 수 있습니다. 1TRUE이고, NULLFALSE으로 처리됩니다. 따라서 EXISTS은 아마도 중복됩니다. 또한

, 1/ NULL 따라서 1/ 0로 전환 될 수있다. 참고 : 여분의 괄호가 필요합니다.

IFNULL((SELECT ... LIMIT 1000,1), 0) 
+0

다양한 솔루션을 작동합니다, 감사합니다! 내 구체적인 설정에 대한 세부 사항을 제공하는 것은이 질문에 대한 주제가 될 수 있습니다.이 질문은 기본 'count (*)> 1000'보다 향상된 것이며 인덱스와 관련이 없습니다. – M1L0U

+0

'FULLTEXT','SPATIAL','PRIMARY' 및 다른 인덱스는 4 가지 방식으로 작동합니다. –

+0

나는 현상금을 제안한 후 결과 값으로 "nothing"또는 "1"대신에 원하는 "0"또는 "1"을 얻는 수정 된 버전을 제안했다. DRY), 여전히 하위 쿼리 기반 (추한 느낌)입니다. 내가 현상금을 남겨 두어 누군가가 스타일 점수에 대한 하위 쿼리없이 그것을 할 수 있는지 알아볼 것입니다. 그러나 그렇지 않으면, 현상금은 저에게 영감을주는 것입니다. 수정 된 버전은 질의 결과를'COUNT'로 감싸는 것입니다 :'SELECT COUNT (*) FROM (SELECT 1 FROM table_with_lot_of_rows where condition_on_index LIMIT 1000, 1); ' – ShadowRanger

1

당신은 LIMIT와 하위 쿼리를 사용하여 쿼리를 최적화 할 수 있습니다

이 경우
SELECT count(*)>1000 FROM (
    SELECT 0 table_with_lot_of_rows 
    WHERE condition_on_index 
    LIMIT 1001 
) as truncated_count; 

는, MySQL은 즉시 충분한 행이 조건을 만족으로 중지합니다.

+0

예,이 – MohanaPriyan