简短回答:(1)确保你保持在同一个大O级别,重用连接,衡量性能;(2) 想想你对数据一致性的关心程度。
长答案:
表现
严格从性能的角度来看,一般来说,除非您已经接近最大化数据库资源,例如最大连接数,否则这不太可能产生重大影响。但是有一些事情你应该记住:
- 替换“2-4”查询的“6-8”查询是否保持相同的执行时间?例如,如果当前的数据库交互是在
O(1)
,它会改变O(n)
吗?或当前O(n)
将更改为O(n^2)
?如果是,您应该考虑这对您的应用程序意味着什么
- 大多数应用服务器可以重用现有的数据库连接,或者拥有持久的数据库连接池;确保您的应用程序不会为每个查询建立新连接;否则这将使它更加低效
- 在许多常见情况下,主要是在具有复杂索引和连接的较大表上,通过主键执行少量查询可能比在单个查询中连接这些表更有效;如果在执行此类连接时,服务器不仅需要更长的时间来执行复杂的查询,而且还会阻止针对受影响表的其他查询,就会出现这种情况
一般来说,关于性能,经验法则是 - 总是衡量。
一致性
然而,性能并不是唯一需要考虑的方面。还要考虑一下您对应用程序中数据一致性的关心程度。
例如,考虑一个简单的案例 -具有一对一关系的表A
,并且您正在使用主键查询单个记录。B
如果您连接这些表并使用单个查询检索结果,您将要么从两者中获得记录,要么从两者中都A
没有B
记录,这也是您的应用程序所期望的。现在考虑如果您将其拆分为 2 个查询(并且您没有使用具有首选隔离级别的事务) - 您从 table 获取记录A
,但在您可以从 table 获取匹配记录之前B
,它被另一个进程删除/更新. 现在您的应用程序有一个记录 fromA
但没有来自B
。
这里的一般问题是 - 您是否关心关系数据的 ACID 合规性,因为它与您正在分解的查询有关?如果答案是肯定的,您必须考虑您的应用程序逻辑在这些特定情况下将如何反应。