2013-07-12 1 views
0

나는 대략 구조를 다음과 함께 데이터베이스가 :sqlite 데이터베이스에서 문자열 목록을 선택하는 가장 빠른 방법은 무엇입니까?

표 (이름) - < 표 2 - < 표 3 (점수)

-<가 많은 관계로 일을 의미합니다. 내가해야 할 일은 주어진리스트의 모든 문자열에 대해 최대 점수 값을 가진 table3의 링크 된 항목을 찾는 것입니다. 내가 지금하는 방식은 아주 느리고, 속도가 빨라질 수도 있습니다. 내가이 일을하고 어떻게

가 :

SELECT k.score,k.yaw,k.pitch,k.roll,k.kp_number,k.ke_number,k.points,k.elems --various fields of third table 
FROM File 
JOIN FaceDetection AS d ON d.f_id=File.file_id --joining second table 
JOIN FaceKey AS k ON k.face_det=d.fd_id --joining third table 
WHERE name=:fld 
ORDER BY k.score DESC 

나는 위의 텍스트 쿼리를 준비, 거래를 열고주기에서 i는 데이터베이스에 관심이 항목을 검색 한 다음 트랜잭션을 커밋합니다. 더 나은, 빠른 방법은 무엇입니까?

+0

쿼리가 정상적으로 처리되었습니다. 데이터베이스는 많은 최적화 자체를 수행합니다. 거래 통화도 그렇게해야합니다. 더 효율적인 방법은 없습니다. –

+0

'ON '의'AND' 조건으로'WHERE' 조건을 넣을 수 있습니까? –

+1

ID 필드에 색인을 넣었습니까? – George

답변

1

인덱스는 조회 또는 정렬에 사용되는 모든 열에 사용할 수 있지만 쿼리는 테이블 당 둘 이상의 인덱스를 사용할 수 없습니다.

EXPLAIN QUERY PLAN 출력을 검사하여이 쿼리가 테이블을 스캔하는지 또는 인덱스를 사용하는지 확인하십시오.

FaceKey이 아닌 테이블에서 값을 반환하지 않으므로 실제로 조인 할 필요가 없습니다. 그러나 아래와 같이 쿼리를 다시 작성하면 도움이 될 수도 있고 도움이되지 않을 수도 있습니다.

SELECT score, 
     yaw, 
     pitch, 
     roll, 
     kp_number, 
     ke_number, 
     points, 
     elems 
FROM FaceKey 
WHERE face_det IN (SELECT fd_id 
        FROM FaceDetection 
        WHERE f_id IN (SELECT file_id 
            FROM File 
            WHERE name = :fld)) 
ORDER BY score DESC 
관련 문제