Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中为perfromant联接的两个属性上唯一的表设置键的最佳方法是什么?_Mysql_Database_Join_Database Design_Foreign Keys - Fatal编程技术网

在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了?性能不应该太差。