2012-04-16 42 views
1

我一直在尋找各地的意見,我仍然不是100%肯定有關改善此問題的最佳方法。我有一個存儲大約130K記錄的mysql INNODB'產品'表。有大約80個字段用於其他產品數據等,我們一直在爲每個供應商(成本/編號/庫存)添加供應商庫存數據字段x 3,導致另外35-40個額外字段。現有的mysql表中的其他字段或單獨的表/ s

我們通過loaddata或php腳本爲xml/xls訂閱源爲每個供應商將供應商數據訂閱源運行到不同的表中。然後,我們運行一個查詢來更新產品中的成本/庫存,並在相關供應商表中匹配每個表中的ID的最新數據。這個過程然後運行我們的每個供應商飼料(目前約15),在某些情況下每天一次,其他兩次/ 3/4次飼料量從幾百到1/3/20/30K不等。

然後,我們運行一個腳本(由於供應商數據饋送的不同導入時間表,每天幾次),比較所有供應商的庫存(來自主要產品表數據),並基於最便宜的供應商那一點。然後,這會更新產品表中每種商品的總體最佳商品價格。

更新最佳價格腳本從某個表中某處存儲某個庫存的所有記錄中進行選擇,然後在使用該價格逐個更新每個產品之前進行計算。我們遇到的問題是,在這段時間裏,我們的速度有所下降,有時候可能只有一分鐘或2分鐘,但有時候可能會花費5/6到10分鐘,這取決於網站流量等因素,可能是因爲產品標籤正在更新,索引,而這是每次運行最多20/30條記錄。

產品表是該網站最繁忙的表格,當更新運行時,我們看到cpu高達300/350%。我們正在設法確定,我們最好的選擇最初是將存儲的最佳價格和總庫存價值分離到另一個表中,並且在我們提取產品數據以避開索引/鎖定問題時加入此表,或者只是簡單地需要遷移到一個新的服務器,仍然可以處理數據庫/網絡服務器/電子郵件等或運行專用數據庫服務器。

問題重新遷移或新的專用數據庫服務器是成本,這是當服務器在這些慢速更新週期的10/20/30/40%CPU超出時罰款時的老闆的停止點。如果我們要去一個數據庫服務器,最簡單的選擇是獲得一個新的服務器,並從中運行數據庫,以節省重新安裝我們的自定義應用程序/郵件服務器/網站應用程序文件等等。如果我們這樣做,我們能夠得到用一個較低規格的服務器,在我們目前擁有的一臺服務器上運行,或者我們真的需要考慮將數據庫服務器作爲2個更好的規格嗎?任何幫助或一般建議將不勝感激!謝謝。

+0

您是否嘗試過一次更新更多記錄,以便索引更新較少?您可以在下班時間安排更新嗎?你有更新的唯一索引(WHERE子句中的列)嗎?只要您的網絡可以處理它,專用的數據庫服務器就是理想選擇。 – 2012-04-16 23:44:44

+0

我的確想過,但大多數更新是不同的,我們正在尋找不同的成本和庫存水平,這可能是80%似乎是不同的項目更新範圍內,所以我不認爲配料將在這種情況下工作.. .. – 2012-04-18 13:58:50

回答

1

這聽起來像你的產品表是非規範化的。如果你不太確定這是什麼意思,閱讀它。瞭解這對你的成功至關重要。

如果我是你,我會選擇這個選項:「將存儲的最佳價格和總庫存值分離到另一個表中,並在我們提取產品數據以獲取索引/鎖定問題時加入此表」。也就是說,我相信您應該從產品表和相關供應商信息的非規格化模式切換到規範化模式。

但是,切換會帶來開發人員的勞動。通常開發人員的工作比新的服務器硬件更昂貴。將一個mySQL數據庫實例從一臺服務器機器遷移到另一臺服務器並不困難。如果您確實購買了新的服務器機器,請購買能夠承受的最快的磁盤存儲子系統。如果您使用RAID 1-0(條帶化和鏡像)而不是RAID 5,則可以使用RAID。除此之外,如果您安裝了具有4GB內存和雙處理器或四路處理器的新服務器,則應該沒問題。

換句話說,購買帶有良好磁盤存儲子系統的2012年普通中端服務器機器。把你的mySQL放在新機器上(不要單獨放置其他東西)。

但是,想想你的應用程序需要擴展多少。

該產品表是否已經大約是幾年後的尺寸?或者您的公司計劃在未來幾個月和幾年內添加大量新產品和新供應商?如果你不得不擴展這個系統,你必須選擇第一個選項(使用開發人員並改變爲更好的,規範化的DBMS模式)。如果你現在咬住子彈並做出這個改變,你的系統將會更容易地擴展。

但是,如果貴公司的產品線相當靜態,那麼添加一臺新服務器五美元或一萬美元左右是最便宜的方法。

+0

謝謝,你已經證實我在想什麼...去選擇1,我想我們最終也會在數據庫服務器的線下結束......產品線在某些情況下每週增加100 /每個供應商200件商品.......然後當我們添加新的供應商時,它可以瞬間達到1000s! – 2012-04-19 22:22:45

相關問題