クエリを次のように書き換えた方が良いでしょう。
SELECT payments.*
FROM customers
JOIN payments
ON payments.id_customer = customers.id
WHERE customers.id_project = 5
これは簡潔ではないように見え、優れたクエリプランナーはあなたがしようとしていることを見て、代わりに上記の結合として相関サブクエリを実行しますが、悪いクエリプランナーは最終的にインデックススキャンを実行する可能性がありますpayments.id_customer
(関連するインデックスがある場合) )(または、さらに悪いことに、テーブルスキャン)より効率的な方法を行う代わりに このクエリの配置がより複雑なものでラップされている場合、優れたクエリプランナーでも最適化を確認できない場合があります。関係をサブクエリではなく結合として表現すると、データ構造を変更するよりも大きな違いが生じる可能性があります。
ジェフが言うように、非正規化は慎重に検討する必要があります。特にレポートの目的でパフォーマンスを簡単に向上させることができますが、サポートするビジネスロジックのバグにより不整合が生じる可能性があります。
サイドノートとして:明らかにあなたのビジネスを知らないので、何かを見逃しているかもしれませんが、あなたのテーブルの関係は奇妙に思えます。彼らは、同じ顧客に対して複数のプロジェクトを持つことは決してできないことを意味します。これは、少なくとも長期間にわたって、私の経験では通常は当てはまりません。
customer project payment
-------- -------- -------
pa_id
pr_id <-- payment
cu_id <-- customer
または、あまり正規化されていない場合(それが必要になるとは思わないが):
customer project payment
-------- -------- --------
pa_id
pr_id <-- payment
cu_id <-- customer
`------------- customer
もちろん、それはまだ2人の顧客との共同プロジェクトの可能性を割り引いています...