Вам было бы лучше переписать запрос как:
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
Конечно, это все еще исключает возможность совместного проекта с двумя клиентами ...