에 의해 영감을 받았습니다. this article 데이터베이스에서 멤버 목록의 내보내기 기능을 최적화하려고했습니다.여러 테이블에 조인 하시겠습니까?
원래 쿼리는 다음과 같다 :
는-- First query
SELECT
*
FROM
members_customer_id_0000000169
WHERE
deleted = '0000-00-00 00:00:00'
-- Second query run for every result from first query
SELECT
stores.external_store_id AS local_store_id
FROM
regions,
stores,
stores_reference_members_customer_id_0000000169
WHERE
regions.customer_id = 169
AND
stores.region_id = regions.id
AND
stores_reference_members_customer_id_0000000169.member_id =' . $result['id'] . '
AND
stores_reference_members_customer_id_0000000169.store_id = stores.id
첫 번째 쿼리는 180K 행을 반환하고 그 성능은 두 번째 쿼리는 모든 180K 시간을 가져 효율적이지 않습니다.
내가 대신이 일을 시도 :
이SELECT
members_customer_id_0000000169.*,
stores.external_store_id AS local_store_id
FROM
members_customer_id_0000000169
LEFT JOIN
stores_reference_members_customer_id_0000000169
ON
stores_reference_members_customer_id_0000000169.member_id = members_customer_id_0000000169.id
JOIN
regions
JOIN
stores
WHERE
members_customer_id_0000000169.deleted = '0000-00-00 00:00:00'
AND
regions.customer_id = 169
AND
stores.region_id = regions.id
AND
stores_reference_members_customer_id_0000000169.store_id = stores.id
결과는 140K 행입니다. 이유는 내가 의도 한대로 local_store_id
이없는 회원을 얻지 못했기 때문일 수 있습니다. 그리고 문제가 무엇인지 확신 할 수 없습니다.
많은 테이블과 WHERE 절이 있기 때문에 조인에 문제가 있다고 확신하지만 두 테이블 간의 LEFT/RIGHT 조인 만 해본 경험이 있습니다.
누구든지 문제를 식별 할 수 있습니까?
'LEFT JOIN'을 'LEFT OUTER JOIN'으로 변경하면 같은 결과가 나타납니다. WHERE 절을 조인으로 옮기는 것은 불가능 해 보입니다. 적어도이 작업을 수행하는 방법에 대해서는 전혀 모릅니다. – Repox
글쎄, 마지막으로 WHERE 절을 조인으로 옮기면 필요한 결과를 얻었습니다. 고맙습니다. – Repox