2009-10-06 2 views
1
내 SQL 내가 쿼리 매개 변수 색인 경우는 그것을 할 수 있다고 생각 (n)이 시간이 선형 시간 또는 로그에 카운트 쿼리를 실행할 것을 알고 싶어

MySQL의 성능과 백작 (*)

+3

무엇이 문제입니까? – Graviton

답변

1
  • 의 MyISAM은 immediatelly 반환합니다.
  • InnoDB는 PK 스캔을하므로 레코드 수에 따라 시간이 선형 증가합니다. 당신이 InnoDB의 테이블을 보유하고 약 레코드 수를 참조해야하는 경우

, 가장 빠른 방법은

EXPLAIN select * from student; 

을 사용

(그러나 InnoDB의 통계가 잘못 될 수 있으므로 40 %의 오류도 꽤있다)
+0

이것은 일반 "SELECT COUNT (*) FROM myTable"쿼리에 해당됩니다. 그러나 시간 복잡도는 필터 또는 기타 제약 조건을 포함하는 쿼리에 따라 다릅니다. – mjv

+0

40 %의 오류가 있습니까? 어떻게 그렇게 잘못 될 수 있습니까? 이것은 진짜 질문입니다. 저는 MySQL 사용자가 아니므로 잘 모릅니다. –

+0

InnoDB에서 스캔 할 예상 열 수의 40 % 오류가 매우 가능합니다. 그러나 97 %의 실행 계획은 정확합니다. (인덱스 힌트가 필요할 때 다른 3 %에서 상처를 입을 수 있습니다) – noonex

1

그것은 모든 큐빙으로 질의에 의존한다. 또는 더 정확하게는 질의 계획 MySql은 궁극적으로 질의를 처리하도록 선택한다.

또한이 모든 O 표현에서 'n'이 의미하는 바에 따라 다릅니다. 예를 들어, 'n'이 결국 반환되는 카운트 값이고, 그 카운트가 여러 테이블을 반복적으로 스캔해야하는 쿼리에 의해 생성 된 것 인 경우, 복잡성은 선형보다 나쁠 수 있습니다.

1

이에 대한 대답은 복잡합니다. 관련된 테이블의 수에 따라 달라질뿐만 아니라 사용중인 스토리지 엔진에 따라 달라질 수 있습니다.

COUNT (*) 매우 빠르게 SELECT가 하나의 테이블에서 검색하는 경우 반환하도록 최적화되어, 다른 열 가 검색되지하고 있습니다 :

은이 매뉴얼의 말씀이다, 그런 말로 미루어 보아, WHERE 절이 없습니다. 예 :

mysql> SELECT COUNT (*) FROM student; 정확한 행 개수가이 저장소 엔진 저장되고 매우 빠르게 액세스 할 수 있기 때문에

이 최적화 만 만 MyISAM 테이블에 적용됩니다. InnoDB와 같은 트랜잭션 저장소 엔진의 경우 정확한 행 수를 저장하면 더 많은 문제가 발생합니다. 여러 트랜잭션이 일 수 있으며, 각각 에 영향을 줄 수 있습니다.

-MySQL Manual

+0

내 쿼리에 where 절이 있지만 where 절의 특성이 인덱싱되었습니다. 예를 들어 큐브 또는 동일한 기술을 사용할 수 있습니까? – tavallaie