2009-12-23 86 views
3

我有一個相當大的社交網絡類網站,我已經工作了約2年(文件的高流量和100的)我一直在嘗試在過去幾年與扭捏東西最多表現爲流量和我學到了許多。現在我有一個巨大的任務,我打算完全重新編碼我的社交網絡,所以我正在重新設計mysql數據庫的一切。我應該把一個更大的mysql表分成多個嗎?

下面是一個照片我做了,我有一個問題關於一對夫婦MySQL表的。我目前有用於登錄過程的登錄表,一旦用戶登錄到站點,他們很少需要再次登錄表,除非編輯電子郵件或密碼。然後我有一個用戶表,它基本上是用戶設置和該網站的配置文件數據。這是我有問題的地方,如果將用戶表分成更小的表,性能會更好?例如,如果您查看用戶表,您會看到幾個我標記爲「setting_」的字段,我應該只創建一個單獨的設置表?我還有標有「計數」的字段,可能是評論,照片,朋友,郵件等的總數。那麼我應該創建另一個表來存儲事物的總數嗎?

我現在把它們全部放在1張桌子上的原因是因爲我在想如果我可以減少mysql查詢,而不是打3個表來獲取每個頁面負載的信息,我可以達到1。

很抱歉,如果這是混亂的,並感謝任何提示。

alt text http://img2.pict.com/b0/57/63/2281110/0/800/dbtable.jpg

+0

你有一個相當大的_what_? – SLaks 2009-12-23 15:11:15

+0

我認爲你的意思是把這個問題標記爲「模式」,而不是「方案」。 – 2009-12-23 15:18:46

+0

我看到一些括號',是嗎? – 2009-12-23 15:19:18

回答

1

我應該只是創建一個單獨的設置表?

所以我應該創建另一個表來存儲事物的總數?

有沒有一個單一的正確答案,這取決於你的應用程序在做什麼。

你可以做的是在開發環境中測量和推斷結果。

一方面,使用單獨的表格將爲您節省一些空間,代碼將更易於修改。

另一方面,您可能會因不得不加入來自不同表格的信息而失去一些性能(而您已經認爲)。

關於計數我認爲它可以在那裏很好,雖然總是說這是更好的計算這種東西,我不認爲這種情況會傷害你。

但是,再次,要知道您和您的特定應用程序哪個更好,唯一的方法是測量,分析並找出這樣做的好處。可能你只會獲得2%的提升。

1

你需要下面的比較之間的性能測試結果:

  1. 離開它單獨
  2. 將其分成兩個表
  3. 使用不同的查詢檢索登錄數據和文件數據(如果你不這樣做的話),在同一個表中的所有數據

另外,如果使用數據表明這將有利,您可以在配置文件數據上實施某種緩存策略。

+0

所有的優點和我在過去的兩年內在這個網站上做了大概數百小時的測試,我的速度非常快,但現在我正在對所有內容進行重新編碼,這是完美的機會 - 安排任何數據庫表格。硬件部分是測試,並分解並測試它,因爲老實說,差異不會那麼大,但是當你有很多流量和數百萬的mysql記錄時,它可能會改變。謝謝你的提示,雖然 – JasonDavis 2009-12-23 15:24:05

+0

絕對。如果您發佈測試結果可能會有所幫助,因爲這些是真正重要的。 – 2009-12-23 15:27:36

0

我不會考慮你的用戶表可怕的大列數,只是我的意見。除非你可以找到刪除冗餘的情況,否則我也不會將該表分成多個表。也許你有很多用戶具有相同的設置,這將是一個打破錶的情況。

2

只要你沒有SELECT * FROM你的表,有2或100個字段不會影響性能。 只需SELECT只有你打算使用的字段,你會適應你當前的結構。

+0

我明白這一點,對不起,在這種情況下,我不是更清楚我的意思是用戶表中有多少列 – JasonDavis 2009-12-23 15:22:00

+0

沒關係,我的意思是表中的列數不會影響性能。無論如何,在大多數數據庫引擎...你是否使用InnoDB? – Patonza 2009-12-23 15:24:25

+0

實際上我相信當前用戶表並不是InnoDB,但我可能會讓這個新表成爲InnoDB,用於行鎖定和表鎖定 – JasonDavis 2009-12-23 15:28:30

1

你應該考慮把計數器 - 列和經常更新的時間戳記放在它自己的表格中---每次你碰到它們整行被寫入。

0

應該考慮單行的平均大小,以便找出檢索是否昂貴。此外,應該嘗試在尋找數據時使用索引... 最重要的是要正確設計,而不僅僅是分裂,因爲「看起來很大」。也許IP或IP可能會去別的地方......取決於保存在那裏的數據。

另外,作爲socialnetworksite使用該數據還處理AUTH和autorization過程(想是這樣),用戶名和用戶表之間的間隔應該提供良好的性能,「引起的登錄的數據是‘足夠短’,而只能在成功登錄後立即訪問配置文件一次。只需做正確的技巧來提高數據庫性能,並完成。

(記住形象化表作爲實體,他們的名字作爲一個實體,而不是他們的集合),你將要考慮決定你是否要分手的單表到時

+0

感謝您的提示,您是否可以詳細說明您的意思(請記住將表格視爲實體,將它們命名爲實體,而不是它們的集合)?謝謝 – JasonDavis 2009-12-23 16:14:51

+0

對。我的意思是(作爲一個古老的習慣,有些有用)以單數名稱命名,嘿。沒什麼大不了的,它只是意味着你有一組行,每一行都與......登錄,...用戶,......位置等有關。不過沒什麼特別的。 – Alfabravo 2009-12-23 21:50:02

0

兩件事多個表格是:

  1. MySQL喜歡小而一致的數據集。如果您可以構建表,以便它們具有固定的行長度,這將有助於以潛在的磁盤空間成本來提高性能。從我所知道的一件事情中,常見的是將固定長度的數據放入自己的表格中,而可變長度數據將放在其他地方。

  2. 連接在大多數情況下性能低於不連接。如果您的表中當前的數據通常會同時被全部訪問,那麼它可能不值得分解,因爲您會放慢兩個插入並且可能會讀取。但是,如果表中某些數據不經常被訪問,那麼出於性能原因,這將是移出表的理想選擇。

我無法找到一個資源網上,以證實這下語句,但我在周杰倫管賦予了MySQL性能優化的談話,他說,MySQL優化有問題,一旦你獲得超過8拘謹,不召回單個查詢(MySQL 5.0。*)。我不確定這個幻數的準確程度如何,但不管連接數通常比查詢單個表的時間要長。

相關問題