在MySQL中为perfromant联接的两个属性上唯一的表设置键的最佳方法是什么?
我有一个成本表,用于存储某一特定日期的项目成本。 该表如下在MySQL中为perfromant联接的两个属性上唯一的表设置键的最佳方法是什么?,mysql,database,join,database-design,foreign-keys,Mysql,Database,Join,Database Design,Foreign Keys,我有一个成本表,用于存储某一特定日期的项目成本。 该表如下 =============================== id item_id cost_date cost =============================== 其中id是主键,item_id是items表的外键,cost_date是项目可用的日期,cost是项目的成本。我还有一张订单表 ============== id order_date ============== 其中id是主键,da
===============================
id item_id cost_date cost
===============================
其中id是主键,item_id是items表的外键,cost_date是项目可用的日期,cost是项目的成本。我还有一张订单表
==============
id order_date
==============
其中id是主键,date是订单日期。如果某个项目是在某一天订购的,则该项目应具有成本条目,其中成本日期与其所属订单的订单日期匹配。
最后,我有一个orders\u items表
==============================
id order_id item_id price
==============================
其中id是主键,order_id是订单的外键,item_id是项目的外键,price是该特定订单中项目的价格
我经常想把价格和成本放在一起考虑,这就导致了这种令人讨厌的连接
FROM orders_items
LEFT JOIN items ON orders_items.item_id = items.id
LEFT JOIN orders ON orders_items.order_id = orders.id
LEFT JOIN costs ON costs.date = orders.date AND costs.item_id = items.id
事实上,我必须为成本进行双重连接,这确实减慢了我的查询速度。我想知道是否有一种方法可以更改键,从而允许一组从长远来看性能更高的连接?
是否有一个好地方可以为costs.id创建一个外键,该外键对于costs中的每一行都是唯一的,并且可以消除双重联接的需要?联接本身并不会减慢您的速度。您的表被适当地规范化了 从您使用表的方式来看,pair(item_id,cost_date)在Costs中是唯一的,不能为NULL。告诉数据库管理系统 索引外键列集及其引用的列,因为您希望对它们进行快速联接:Items(id)、Costs(id)和(item_id、cost_date)(在MySQL中用于索引(item_id)和(cost_date))、Orders(order_date)和Orders_Items(order_id)和(item_id)。请注意,您实际上不需要Costs id和Orders\u items id,因为这些表/关系具有自然键。MySQL自动索引主键 外键声明会产生巨大的差异,因为DBMS知道当它找到匹配项时,没有其他匹配项。索引有很大的区别,因为它们要么避免扫描(散列),要么缩短扫描(排序),并且可以避免访问辅助存储 非规范化引入了需要管理的冗余,包括额外的代码和更新时的计算,可以极大地增加表的大小,增加行的大小,迫使数据从内存访问到辅助存储。只要做最简单的设计。随后确定最有效的位置,只有在测量和确认后才进行优化和反规范化
PS这里最直接的查询是使用内部联接。联接本身并不会减慢您的速度。您的表被适当地规范化了 从您使用表的方式来看,pair(item_id,cost_date)在Costs中是唯一的,不能为NULL。告诉数据库管理系统 索引外键列集及其引用的列,因为您希望对它们进行快速联接:Items(id)、Costs(id)和(item_id、cost_date)(在MySQL中用于索引(item_id)和(cost_date))、Orders(order_date)和Orders_Items(order_id)和(item_id)。请注意,您实际上不需要Costs id和Orders\u items id,因为这些表/关系具有自然键。MySQL自动索引主键 外键声明会产生巨大的差异,因为DBMS知道当它找到匹配项时,没有其他匹配项。索引有很大的区别,因为它们要么避免扫描(散列),要么缩短扫描(排序),并且可以避免访问辅助存储 非规范化引入了需要管理的冗余,包括额外的代码和更新时的计算,可以极大地增加表的大小,增加行的大小,迫使数据从内存访问到辅助存储。只要做最简单的设计。随后确定最有效的位置,只有在测量和确认后才进行优化和反规范化
PS这里最直接的查询是使用内部联接。请显示包含索引的表定义。
成本
需要索引(日期、项目id)
(按任意顺序)。或者,也许已经是PK了?性能应该不会太差。请显示包含索引的表定义。成本
需要索引(日期、项目id)
(按任意顺序)。或者,也许已经是PK了?性能不应该太差。