나는 H2를 사용하고 있으며 다래 대 관계를 통해 연결된 자체 (저널 엔트리)와 저자 (테이블 Persons) 테이블에 저자. 데이터베이스가 상당히 큽니다 (900'000 명 + 2.5M + 권).H2에서 다 대다 관계에서 효율적으로 선택
이름이 패턴 (LIKE '% pattern %')과 일치하는 저자가 한 명 이상인 모든 도서의 목록을 효율적으로 선택하려고합니다. 여기의 트릭은 패턴이 일치하는 저자의 수를 엄하게 제한해야하며 각 저자는 합리적으로 적은 수의 관련 서적을 가지고 있어야한다는 것입니다. ,
SELECT p.*, e.title FROM Persons AS p
INNER JOIN Authorship AS au ON au.authorId = p.id
INNER JOIN Entries AS e ON e.id = au.entryId
WHERE p.name like '%pattern%';
가 나는 저자의 아주 작은 (하위) 테이블에 합류 해요로 첫 번째는, 훨씬 빠른 것으로 예상 :
SELECT p.*, e.title FROM (SELECT * FROM Persons WHERE name LIKE '%pattern%') AS p
INNER JOIN Authorship AS au ON au.authorId = p.id
INNER JOIN Entries AS e ON e.id = au.entryId;
과 :
나는 두 개의 쿼리를 시도 그러나 둘 다 오래 걸립니다. 실제로 필자는 쿼리를 수동으로 세 가지 선택으로 분해하고 원하는 결과를 더 빨리 찾을 수 있습니다.
쿼리를 설명하려고 할 때 실제로는 테이블과 WHERE 절에 대한 전체 조인과 비슷하다는 것을 알게되었습니다. 따라서 제 질문은 : 어떻게하면 빠른 선택을 얻을 수 있습니까? 저자의 필터가 다른 두 테이블과 훨씬 더 작은 조인을 가져야한다는 사실에 대해서?
MySQL에서 동일한 쿼리를 시도하고 예상했던 것과 일치하는 결과를 얻었음에 유의하십시오 (먼저 선택하는 것이 훨씬 빠름).
감사합니다.
첫 번째 JOIN에서 SUBSELECT 인 이유는 무엇입니까? 단순히 'INNER JOIN authorship AS au ON ...'이 아닌가? – wonk0
네가 맞아, 나는 변화를 만들었다. 쿼리는 같은 것 (적어도 EXPLAIN에 따르면)으로 변환되지만 이제는 더 간단합니다. 감사합니다. – Philippe
이러한 쿼리에 대한'EXPLAIN ANALYZE SELECT ... '의 결과는 무엇입니까? –