SELECT 1
FROM table_with_lot_of_rows
WHERE condition_on_index
LIMIT 1000, 1;
작품이 방법 :
- (아마도 더 빨리 데이터를 사용하는 것보다) 인덱스
- 이 아무것도를 수집하지 않습니다 1000 개 행을 건너을 사용. (다른 답변보다 낫습니다.)
- 멀리 만들면 리터럴
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을 사용하고 있고 WHERE
이 MATCH...
인 경우, 제가 말했던 대부분이 적용될 수 없을 것입니다. FULLTEXT
은 아마도 나머지 엔진에 ORDER BY
및 LIMIT
으로이 게임을 할 수있는 기회를주기 전에 모든 결과를 가져옵니다.
실제 검색어 인 EXPLAIN
과 SHOW CREATE TABLE
을 표시하십시오. 그리고 진짜 목표는 무엇입니까? 쿼리가 "너무 많은"결과를 제공하는지 확인하려면?
가능한 개선 내 초기 SELECT
반환 1
또는 NULL
을 스칼라 때문에
(상황에 따라)는, 이러한 WHERE
로 어떤 부울 컨텍스트에서 사용할 수 있습니다. 1
은 TRUE
이고, NULL
은 FALSE
으로 처리됩니다. 따라서 EXISTS
은 아마도 중복됩니다. 또한
,
1
/
NULL
따라서
1
/
0
로 전환 될 수있다. 참고 : 여분의 괄호가 필요합니다.
IFNULL((SELECT ... LIMIT 1000,1), 0)
다양한 솔루션을 작동합니다, 감사합니다! 내 구체적인 설정에 대한 세부 사항을 제공하는 것은이 질문에 대한 주제가 될 수 있습니다.이 질문은 기본 'count (*)> 1000'보다 향상된 것이며 인덱스와 관련이 없습니다. – M1L0U
'FULLTEXT','SPATIAL','PRIMARY' 및 다른 인덱스는 4 가지 방식으로 작동합니다. –
나는 현상금을 제안한 후 결과 값으로 "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