다음과 같이 쿼리를 다시 작성하는 것이 좋습니다.
SELECT payments.*
FROM customers
JOIN payments
ON payments.id_customer = customers.id
WHERE customers.id_project = 5
이것은 간결하지 않은 것으로 보이며 좋은 쿼리 플래너는 위의 조인으로 상관 된 하위 쿼리를 수행하려고 시도하고 실행하려고 시도하지만 잘못된 쿼리 플래너는 인덱스 스캔을 수행 payments.id_customer
할 수 있습니다 (관련 인덱스가 있다고 가정) 보다 효율적인 방법으로 작업하는 대신) (또는 더 나쁜 테이블 스캔)을 수행하십시오. 이 쿼리의 배열이 더 복잡한 것으로 랩핑되어 있으면 좋은 쿼리 플래너조차도 최적화를 보지 못할 수 있습니다. 하위 쿼리가 아닌 조인으로 관계를 표현하면 데이터 구조를 변경하는 것보다 더 큰 차이를 만들 수 있습니다.
Jeff가 말했듯이 모든 비정규 화는 신중하게 고려해야합니다. 특히 일부보고 목적으로 성능을 쉽게 향상시킬 수 있지만 지원하는 비즈니스 로직의 버그로 인해 불일치가 발생할 수 있습니다.
참고로 : 분명히 나는 당신의 사업을 모른다. 그래서 나는 뭔가를 놓칠 수 있지만 테이블 관계는 나에게 이상한 것처럼 보인다. 그들은 당신이 적어도 오랜 기간 동안 내 경험상 사실이 아닌 동일한 고객을 가진 하나 이상의 프로젝트를 가질 수 없음을 의미합니다.
customer project payment
-------- -------- -------
pa_id
pr_id <-- payment
cu_id <-- customer
또는 덜 표준화 된 경우 (필요한지 의심 스럽지만) :
customer project payment
-------- -------- --------
pa_id
pr_id <-- payment
cu_id <-- customer
`------------- customer
물론 두 고객과의 공동 프로젝트 가능성을 여전히 할인합니다 ...