我想知道什么是最好的解决方案(从性能角度来看)。我有一个Orders表,它可以有一个特定的OrderShipment关系。 OrderShipment可以是一个正常的运输或在服务点交付(在荷兰,只是一个下降点,当你在家里,如超市,视频等)。
目前我在Order-table中使用HasOrderShipment字段来确定是否必须执行第二个查询才能获得货件。
当客户在服务点选择交付时,我需要存储此服务点的地址详细信息。现在我的问题是,从性能的角度来看,我应该使用adressfields扩展OrderShipment表(在除服务点传递之外的所有其他情况下将这些字段保留为NULL)或创建一个存储地址详细信息的HasOrderShipmentServicePointAddress表。
ordertable行约5.2米,每天增加约21.500个订单(1-jan-11/23-jan-11平均值)。
答案 0 :(得分:0)
嗯,由于表格很小,我个人不会过分担心它(是的,数据库术语中有500万行非常小)。你的查询现在太慢了吗?如果是这样,请优化它。如果没有,请不要担心。
现在,就您的具体问题而言,如果您有足够的数据,您可能会建立一个汇总表。由于MySQL不支持物化视图(索引并存储在磁盘上的视图),因此添加视图对性能术语的帮助不大(但它有助于提高可读性)。相反,您可以添加摘要表。摘要表将是特定查询的结果。因此,不是将额外的列添加到规范化表中,而是复制表并将列添加到新表中,然后使用触发器来保持更新。我在一个单独的表中执行此操作的原因是您仍然具有规范化表以强制参照完整性以及对规范化数据更有效的查询。但是,您可以将摘要表用于需要执行复杂连接的查询(您基本上是预先计算连接)。
但是,我再次强调,除非你必须这样做,否则甚至不会想到做这样的事情。首先尝试正常的优化路径(索引,EXPLAIN
,重写查询,更多内存等)。使用汇总表作为最后的手段......