您最好将查询重写为:
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
当然,这仍然打折了与两个客户进行联合项目的可能性。