2014-09-26 8 views
0

B 열에 의해 인덱싱 된 C 열과 주어진 상수 k가있는 테이블 T가 있다고 가정합니다. 다음 쿼리의 결과를 가정하는 것은 n은 다음과 같습니다임의의 DBMS에 대한 로그 시간 카운트 (*) 범위 쿼리

select count(*) from T where C > k; 

내가 B- 트리 색인 열 C로, MySQL은 (이노) 이러한 쿼리를 시도하고, n의 값을, 더 큰 실현을 느린 질문. 큰 테이블 (GBs)에서, 나는 심지어 몇 분을 기다려야한다. 그래서, 시간 복잡성은 n에 대해 선형이라고 추측합니다. 그러나 테이블 크기와 관련하여 대수적 인 시간에 수행 할 수있는 B-Tree 내부 노드에 대한 집계 정보가 저장되어 있는지 알고 있습니다.

누구든지 DBMS에 로그 솔루션을 제안하거나 MySQL의 쿼리 시간을 줄이기 위해 어떤 트릭을 제안 할 수 있습니까?

답변

0

예, 모든 DBMS는 인덱스를 지원합니다. 모든 K 필드가 색인되어 있는지 확인하십시오. 슬프게도 기본적으로 할 수있는 한 가지를 알고 있습니다.

link은 SQL Server 용이지만 약간의 수정으로 MySql에서 작동해야합니다.

확실하지 않지만이 질문은 question on SO과 관련되어 보입니다.

+0

고맙지 만 내 질문에 대한 답변이 아닙니다. –

+0

로그 방식으로 색인을 작성하는 한 가지 방법은 색인을 사용하는 것입니다. 나는 또한이 페이지를 추천한다. (DBMS는 문법에 약간의 변형이있다.) [Luke 색인을 사용한다] (http://use-the-index-luke.com/sql/table-of-contents) –

+0

다시 한번 읽으십시오. 내 질문. 이미 색인을 사용했습니다. 모든면에서 제 질문에 대해 오해하셨습니다. 덕분에 –

1

실행 계획을 확인할 때까지는 아무 것도 알 수 없습니다. 적어도 오라클에서는 C 열의 히스토그램을 사용하여 C의 다른 값에 대해 서로 다른 exec 계획을 세워야합니다.

또한 색인의 깊이는 대개 3-5입니다. 대수의 밑은 아주 큽니다. 또한 테이블에서 행을 삭제할 때 많은 데이터베이스가 속이며, 일반적으로 리프 노드는 이미 삭제 된 행을 가리킬 수 있습니다. B- 트리에서 집계 값을 유지하려는 노력은 가치가 없으며 확장 성이 좋지 않습니다.

다양한 멋진 색인 생성 옵션이있는 데이터베이스를 찾고 있다면 PostreSQL을 살펴보십시오.

+0

. 동시성 제어가 어려운 일임을 안다. 그러나, 특정 시점에 관심이있는 지금은 많은 업데이트가 없으며 행을 삽입하는 동안 전체 테이블을 잠그는 것에 별 관심이 없습니다. 어떻게에 대한? –

+0

데이터베이스가 다른 목적으로 설계되었다는 사실에 대해 조정해야 할까봐 걱정됩니다. 대부분의 경우 유지 관리 비용이 비싸기 때문에 인덱스에는 트리 노드에 집계가 없습니다. 하지만 먼저 쿼리의 실행 계획을 확인해야합니다. – ibre5041