2016-02-05 54 views
1

我有一個成本表,用於存儲特定日期的物料成本。 該表如下最好的方式來鍵入一個表是唯一的兩個屬性的perfromant連接在MySQL中?

=============================== 
id item_id cost_date cost 
=============================== 

其中ID是主鍵,ITEM_ID是一個外鍵的項目表,cost_date是該項目是可用的日期,成本是該項目的成本。我也有一個訂單表

============== 
id order_date 
============== 

其中id是主鍵,date是訂貨日期。如果項目在某一天訂購,它應該具有成本條目,其中cost_date與其所屬訂單的order_date相匹配。 最後我有一個orders_items表

============================== 
id order_id item_id price 
============================== 

其中id是主鍵,ORDER_ID是外鍵的訂單,ITEM_ID是外鍵的項目和價格是項目的特定順序的價格。

我經常想看看導致這個討厭的連接集的價格和成本。

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 

事實上,我必須爲費用進行雙連接,這實際上減慢了我的查詢速度。我想知道是否有一種方法可以改變密鑰,以允許從長遠來看更高性能的一組連接? 是否有一個很好的地方可以爲cost.id創建一個外鍵,這對於成本中的每一行都是唯一的,並且會消除對雙連接的需求?

+1

請顯示您的表格定義,包括索引。 – philipxy

+0

'費用'需要'INDEX(日期,item_id)'(按任意順序)。或者,也許它已經是PK了?表現不應該太差。 –

回答

0

連接本身並沒有減慢你的速度。你的表格適當標準化。

從您如何使用表中,對(item_id,cost_date)在成本中是UNIQUE NOT NULL。告訴DBMS。你的外鍵列集及其引用的列既然你想快速

指數加入他們:項目(ID),成本(ID)&(ITEM_ID,cost_date)(在MySQL服務索引(ITEM_ID)&(cost_date) ),訂單(order_date)和訂單項目(order_id)&(item_id)。請注意,由於這些表格/關係具有自然鍵,因此您並不需要Costs id和Orders_items id。 MySQL會自動索引PRIMARY KEY。

外鍵聲明造成了很大的差異,因爲DBMS知道當它找到匹配時就沒有別的了。索引會產生巨大的差異,因爲它們可以避免掃描(散列)或縮短它們(排序),並且可以避免訪問輔助存儲。

非規範化引入冗餘來管理,包括額外的代碼和更新計算,並且可以大大增加表的大小,增加行的大小,迫使數據從內存訪問次級存儲。只要做出最直接的設計。稍後確定最有效的地方,只有在測量和確認後才能進行優化和非規範化。

MySQL 5.7 Reference Manual 8.3 Optimization and Indexes

PS最直接查詢這裏是使用內部連接。

相關問題