繁体   English   中英

创建左联接还是向某些表添加一些额外的列?

[英]Create a left join or add a few extra columns to a certain table?

我想知道什么是最好的解决方案(从性能的角度来看)。 我有一个Orders表,它可以具有特定的OrderShipment关系。 OrderShipment可以是正常的运输,也可以是在服务点(在荷兰,这是您不在家或不在家时(例如,超市,音像店等)的下车点)进行的送货。

目前,我正在使用Order-table中的HasOrderShipment字段来确定是否必须执行第二个查询才能获得Shipment。

当客户选择在服务点交货时,我需要存储该服务点的地址详细信息。 现在,我的问题是,从性能的角度来看,我应该使用adressfields扩展OrderShipment表(在除服务点交付以外的所有其他情况下,将这些字段保留为NULL)还是创建一个其中存储了地址细节的HasOrderShipmentServicePointAddress表。

订单表约有520万行,并且每天以约21.500笔订单增长(11年1月1日至11月23日平均)。

好吧,对于这么小的表,我个人不会对此太担心(是的,从数据库角度来说,500万行是非常小的)。 您的查询现在太慢了吗? 如果是这样,请对其进行优化。 如果没有,请不要担心。

现在,就您的特定问题而言,如果您有足够的数据,则可能无需构建汇总表。 由于MySQL不支持实体化视图(被索引并存储在磁盘上的视图),因此在性能方面添加视图实际上并没有多大帮助(但它将有助于提高可读性)。 相反,您可以添加一个摘要表。 摘要表将是特定查询的结果。 因此,您无需复制多余的列到规范化表中,而是将表复制并将列添加到新表中,然后使用触发器保持其更新。 我在单独的表中执行此操作的原因是,您仍然具有规范化的表来强制执行参照完整性,并且对于使用规范化的数据更有效的查询也是如此。 但是您可以将汇总表用于需要进行复杂联接的查询(基本上是在预先计算联接)。

但是我要强调,除非您必须这样做,否则不要考虑做这样的事情。 首先尝试正常路线进行优化(索引, EXPLAIN ,重写查询,更多内存等)。 将汇总表用作最后的选择...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM