2009-07-29 70 views
2

在MySQL中,它通常更快/更高效/可擴展到返回100行3列,或1行100列?哪個更快:多行還是多列?

換句話說,當存儲與記錄有關的許多key =>值對時,最好將每個key =>值對存儲在單獨的行中,並以record_id作爲關鍵字,或者每行record_id與每個鍵的列?另外,假設還需要相當有規律地添加/刪除密鑰,我認爲這會在表格變得足夠大時影響許多列方法的長期可維護性。

編輯:爲了澄清,「定期」我的意思是增加或刪除一個月左右的密鑰一次。

回答

10

您不應該定期添加或刪除列。

+3

每月定期進行一次。基本上,一旦你的應用程序投入生產,你就不應該改變數據庫模式。唯一的例外是如果您的業務需求發生根本性變化。 – 2009-07-29 19:56:34

1

如果您的密鑰是預設的(在設計時已知),那麼是的,您應該將每個密鑰放入單獨的列中。

如果它們在設計時不知道,那麼您必須將您的數據作爲鍵值對列表返回,您應該稍後在RDBMS之外解析這些鍵值對。

1

如果你正在存儲鍵/值對,你應該有一個有兩列的表,一個用於鍵(使這個表​​成爲PK)和一個用於值(可能根本不需要這個索引) )。請記住,「鑰匙,鑰匙,除了鑰匙以外什麼都沒有。」

在多列方法中,你會發現你的表增長沒有限制,因爲刪除列會刪除所有的值,你不會想這樣做。我從這裏的經驗講述了一個遺留系統的工作原理,該遺留系統有一個近1000列的表格,其中大部分是位域。最終,您不再能夠刪除任何列,因爲有人可能會使用,並且上次執行此操作時,您的工作時間一直持續到凌晨2點,回滾到備份狀態。

2

http://en.wikipedia.org/wiki/Entity-Attribute-Value_model

有很多關於這個模式不好的事情,如果有任何其他替代我不會使用它。如果您不知道您的應用程序需要的大部分數據列(除少數用戶可定製的字段外),那麼您需要花更多時間在設計中並將其計算出來。

0

首先:確定您的數據需要訪問的頻率。如果數據總是需要一次性檢索,並且大部分都使用了,那麼請考慮將所有密鑰對存儲爲序列化值或xml值。如果您需要對該數據進行任何類型的複雜分析,並且需要值對,那麼列可以正常工作,但將其限制爲您知道需要執行查詢的值。設計一個參數而不是一行的查詢通常更容易。如果它們全部在一行中而不是很多,你也會發現使用 返回的值更容易。第二種:將你最常訪問的數據分開放在它自己的表中,其他數據放在另一個表中。 100列的順序很多,所以我建議你將數據分成更小的塊,這樣更易​​於管理。最後:如果您的數據可能會頻繁更改,那麼您應該使用在一個表中創建列(鍵),然後使用其數字鍵值來存儲鍵值。這假定您將多次使用相同的密鑰,並在您執行查找時加快搜索速度。

相關問題