1. 程式人生 > >PK資料庫 聯合主鍵和自增主鍵

PK資料庫 聯合主鍵和自增主鍵

主鍵:主鍵是用來幹嘛的?一般來說是為了建立唯一標識,建立索引的。

主鍵的使用目的:

a.為了保證資料查詢唯一;

b.提高儲存效率和索引效率。

索引:如果表的讀操作少或者沒有,索引效率會高,如果表的寫操作較多或者大量,建立索引會慢。

主鍵的設定方法有3種:

一種是設定自增長主鍵,第二種是採用業務主鍵,第三種是生成唯一序列(使用uuid/guid);
如何選擇主鍵設定方式:

必須按情況來看:

 1.使用業務聯合主鍵:

a.是否絕大部分查詢都是能用上聯合主鍵的查詢,並且沒有其它查詢方式join到這個表,也沒有其它索引和外來鍵,那麼適合聯合主鍵+cluster key,這樣查詢效率高一些。

b.聯合主鍵和自增主鍵在查詢上沒什麼效能上的區別(前提是索引相同,運用得當)。寫的效能上是有區別的,因為聯合主鍵會使用更多的block去建立索引,所以在寫操作上效能要低一些。

2.使用生成唯一的序列
 a.如果不滿足使用自增的要求,則建議優先使用字元主鍵。類似網站資料庫,可以採用uuid、guid這類無規則字元做主鍵。因為字元主鍵查詢速度不比自增主鍵慢。

b.UUID.randomUUID().toString()是javaJDK提供的一個自動生成主鍵的方法。UUID(Universally Unique Identifier)全域性唯一識別符號,是指在一臺機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的,是由一個十六位的數字組成,表現出來的形式。由以下幾部分的組合:當前日期和時間(UUID的第一個部分與時間有關,如果你在生成一個UUID之後,過幾秒又生成一個UUID,則第一個部分不同,其餘相同),時鐘序列,全域性唯一的IEEE機器識別號(如果有網絡卡,從網絡卡獲得,沒有網絡卡以其他方式獲得),這樣對於分庫分表的情況就會很適用。UUID的唯一缺陷在於生成的結果串會比較長。

c.防止注入式攻擊,當我們使用主鍵自增的時候,需要刪除一個東西的時候,一般都是id=?。這樣的話我就可以在url中修改這個id的值,這樣可能就被人刪除了其他東西,UUID這個就是給主鍵id加上一層鎖,使它不暴露給使用者;

3.使用自增主鍵的場景:

其它大部分情況仍然適合自增主鍵。