2013-10-29 3 views
1

SQLLite에서 세 개의 열에 고유 한 인덱스가 설정되어 있고 다음 쿼리에서 결과를 검색 할 때 가끔 약 10 초 (데이터베이스 크기는 약 25,000 행)가 걸리기 때문에 다른 인덱스가 필요한지 궁금합니다.SQLLite 이외에도 다른 인덱스가 필요합니까?

SELECT * FROM books 
WHERE (Author="Roger Davies" COLLATE NOCASE AND 
Title>="My Best Days" COLLATE NOCASE AND 
CatID>"rtYY91" COLLATE NOCASE) 

OR Author > "Roger Davies" COLLATE NOCASE 

ORDER BY Author COLLATE NOCASE ASC, 
Title COLLATE NOCASE ASC, 
CatID COLLATE NOCASE ASC LIMIT 10 

인덱스는 다음과 같습니다 UNIQUE INDEX 책 ON booksIndex (CATID, 저자, 제목) 귀하의 지침

감사를 만듭니다.

답변

2

색인이 전혀 사용되지 않습니다. (EXPLAIN QUERY PLAN으로 알 수 있습니다.)

이 쿼리에 인덱스를 사용하려면 index definition의 열에 COLLATE NOCASE를 추가하십시오.

그러나 색인의 열은 가장 왼쪽의 색인 열로 시작해야하며 부등호 비교 (> =와 같음)는 1 열 열에서만 사용할 수 있으며 이후의 모든 색인 열 사용되는 것을 막는다.

그래서이 특정 인덱스를 최적화 할 수있는 가능한 비교는 다음과 같습니다

  • CatID = x; 또는
  • CatID > x; 또는
  • CatID = x AND Author = y; 또는
  • CatID = x AND Author > y; 또는
  • CatID = x AND Author = y AND Title = z; 또는
  • CatID = x AND Author = y AND Title > z.

당신이 저자에 의해 처음으로 정렬 쿼리를 최적화하려면

을 (단, 최적화이 일치하도록. WHERE 절에서 비교를 다시 정렬 할 수 있습니다), 당신과 함께 인덱스를 필요 첫 번째 열로.

다른 정렬 순서로 다른 쿼리를 사용할 수있는 경우 여러 인덱스가 필요합니다. 그런 경우 인덱스 수가 너무 많지 않도록 단 하나의 인덱스만을 갖는 것이 더 좋습니다.

+0

감사합니다. CL. 따라서 검색 할 수있는 각 열에 단일 색인을 설정하면됩니다. 이미 해당 인덱스가있는 컬럼에 대해 CREATE INDEX를 실행하면 SQLLIte가이를 무시하게됩니까? 색인을 사용자 데이터베이스에 추가해야합니다. 또한 원본 인덱스를 유지해야 세 열이 고유하게 유지되지만 아마도 단일 인덱스도 설정할 수 있습니다. 이 경우 원본 고유 인덱스를 NOCASE로 가져 오거나 인덱스에서만 처리해야합니까? – Shaun

+0

SQLite는 중복 색인을 생성하는 것을 방지하지 않습니다. 대/소문자를 구분하지 않으려면 원본 고유 인덱스에 COLLATE NOCASE가 필요합니다. –

+0

COLLATE NOCASE를 기존 색인에 추가 할 수 있습니까? 아니면 색인을 삭제하고 다시 만드는 것이 가장 좋습니까? 마지막 질문 (감사합니다 CL) - 이미 데이터로 채워진 열에 인덱스를 적용 할 때 인덱스에 이미 포함 된 것이 포함될 것인지, 아니면 SQLLite에 플러시 할 것을 알려야합니까? – Shaun

관련 문제