2015-01-02 30 views
0

我們真的在爲我們新的數據密集型項目設計主鍵時遇到技術問題。爲未來安全的數據密集型數據庫提供更好的PK

請說明我們的數據密集型數據庫更適合哪種PK設計。

  1. 該數據庫是數據密集型和持久性的。
  2. Atleast 3000用戶每秒訪問它。

請問我們的數據庫哪種類型的PK更好,表格在未來不太可能改變。

1.INT/BIGINT自動增量列爲PK

2.複合鍵。

3.Unique varchar PK。

+0

它幾乎沒有任何區別。 – Ben

+0

所以使用多列組合鍵不會降低性能? –

+0

你使用的是SQL Server還是MySQL?你如何評價更好?最有前途的證據?最小的碰撞機會?最少的記憶?這是每秒3000次讀取,或每秒3000次寫入,或混合(如果是這樣的話)?你的複合鑰匙有哪些類型?他們保證是獨一無二的嗎? – GarethD

回答

2

我會選擇1,使用BIGINT自動增量列作爲PK。原因很簡單,每次寫入都會寫入當前頁面的末尾,這意味着插入新行非常快。如果您使用組合鍵,那麼您需要一個訂單,除非您按照組合鍵的順序插入,否則您需要拆分頁面以插入,例如,設想這樣的表:

A | B | C 
---+---+--- 
1 | 1 | 4 
1 | 4 | 5 
5 | 1 | 2 

當主鍵是在複合鍵(A,B,C),假設我要插入(2,2,2),這將需要插入如下:

A | B | C 
---+---+--- 
1 | 1 | 4 
1 | 4 | 5 
2 | 2 | 2 <---- 
5 | 1 | 2 

這樣聚簇鍵維護其順序。如果您已經插入的頁面已滿,那麼MySQL將需要拆分頁面,將一些數據移動到新頁面,以便爲新數據騰出空間。這些頁面拆分非常昂貴,因此除非您知道要插入順序數據,否則使用自動增量列作爲集羣鍵意味着除非您亂搞增量,否則不應該拆分頁面。

你仍然可以爲保持完整性的主鍵添加一個唯一的索引,你仍然會對索引上的拆分有同樣的問題,但由於索引會比聚簇索引更窄,拆分因爲更多的數據可以放在頁面上,所以不會那麼頻繁。

或多或少的相同的參數適用於唯一的varchar列,除非您有某種確保varchar是連續的過程,但生成順序varchar比自動增量列更昂貴,並且我不能立即看到優點。

+0

謝謝,這將幫助我們很多寫道:每秒讀數口糧將7:3和組合鍵的類型是3-4列bigint在進一步的過程 –

+0

如果自動增量達到極限,該怎麼辦?因爲這些表格每天都會填滿數百萬行。 –

+0

[無符號BIGINT的限制是](http://dev.mysql.com/doc/refman/5.1/en/numeric-type-overview。html)18,446,744,073,709,551,615 - 即使您每秒插入1,000,000條記錄,也需要584,542年才能達到上限。我非常確定你的數據庫在你達到BIGINT的極限之前會變得不可用。 – GarethD

1

這並不容易回答。

首先,使用複合鍵作爲主鍵是直接的方法。當數據庫結構發生變化時,ID會派上用場。

假設您在不同國家/地區銷售不同尺寸的產品。主鍵是粗體。

  • 產品(product_no,名稱,supplier_no,...)
  • product_size(product_no,大小,EAN措施,...)
  • product_country(product_no,country_isocode,translated_name,...)
  • product_size_country(product_no,大小,country_isocode,增值稅,...)

這是很容易WITE數據,因爲你正在處理自然鍵,這是用戶使用的。 dbms保證了數據的一致性。

現在同樣的技術標識:

  • 產品(PRODUCT_ID,product_no,名稱,supplier_no,...)
  • product_size(product_size_id,大小,PRODUCT_ID,EAN措施, ...)
  • product_country(product_country_id,PRODUCT_ID,COUNTRY_ID,translated_name,...)
  • product_siz e_country(product_size_country_id,product_size_id,COUNTRY_ID,增值稅,...)

要得到的ID是現在需要一個額外的步驟,插入數據時。你仍然必須確保product_no是唯一的。因此,product_id上的唯一約束不會替代product_no上的該約束,而是添加到它。 product_size,product_country和product_size_country相同。而且,product_size_country現在可以鏈接到不同產品的product_country和product_size_country。 dbms不能保證數據的一致性。

但是,必須對數據庫結構進行更改時,自然鍵有其弱點。假設在數據庫中引入了一家新公司,並且每個公司的產品號碼都是唯一的。使用基於ID的數據庫,您只需將公司ID添加到產品表中即可完成。在基於自然鍵的數據庫中,您必須將公司添加到所有主鍵。更多的工作。 (但是,多長時間一次必須對數據庫進行這樣的更改,在很多數據庫中從不)

還有什麼需要考慮的?當數據庫變大時,可能需要對錶進行分區。使用自然鍵,您可以通過所述公司劃分您的桌子,假設您通常希望從一家公司或另一家公司選擇數據。使用ID,您將通過分區來增強訪問權限?

那麼,這兩個概念肯定有優點和缺點。至於你的第三個選項來創建一個唯一的varchar,我看到使用整數ID沒有任何好處。

+0

我們正在考慮寫作和閱讀的速度,並且表格可能會在未來增加或刪除某些列寫作和閱讀這將是最好的方式? –

+0

這兩種技術的速度應該沒有太大的差別。理論上來說,通過一個單一的數字而不是一個複合鍵來訪問應該稍微快一點,但我認爲這種差異不會被測量到。因此閱讀和更新(因爲通常不更新密鑰)應該同樣快。至於插入數據:使用組合鍵應該會更快。原因是技術ID是額外的東西。如前所述,您將擁有相同的唯一約束,這意味着要編寫相同的唯一索引*加上ID的唯一索引。 ... –

+0

分區表,智能地完成,可以進一步加速數據訪問。如上所述,我認爲使用自然鍵更容易。不過,我必須承認,我不知道分配對插入有積極或消極影響。 –