2009-10-14 66 views
1

我有一個非常大的表,它目前大約70M行,每天增長數千,這個模式現在每天都在翻轉,所以我正在轉向分區表,重新設計ddl。mysql 7列pk對1列md5唯一約束

表是basicly NOT NULL整數集合(一些媒體有些INT一些微小的) 這就需要有一組7列(該表中有更多的列),這是非常昂貴的唯一約束計算每插入,並進一步增加索引文件的大​​小,因爲我從來沒有檢索它,我寧願放棄它,並以某種方式md5 /可能簡單concat的值...還不知道。

問題是,唯一可以容納這麼大的唯一編號的列類型是varchar我在質疑這個PK是否會更好? allso因爲我將有一個PRIMARY KEY'part_key'(site_id,id)我將不得不 在設計分區的獨特約束,總結... 我敢肯定,這不是一個新問題,但我無法找到任何比較兩者的基準/文檔,有沒有人有任何這個問題的經驗? 這個問題是真的應該PK是整個8個字段(請記住,這張表可能會有更多的100M行),當我從來沒有通過PK檢索或只是一個獨特的字段的散列值 PS:檢索主要是由7列中的2列完成的 磁盤大小不是問題 謝謝。

回答

0

直到mysql獲取分區修剪,我建議(吞噬)非規範化您的表虛假分區。做類似於你的第一個值的模32並製作32個表。

更新:明顯的mysql 5.1.6及更高版本支持修剪(http://dev.mysql.com/doc/refman/5.1/en/partitioning-pruning.html),所以我強烈建議是升級,然後讓MySQL來處理分區的你,可能是使用的7列一個的哈希值。

0

如果您可以找到與您的記錄查找匹配的良好散列,那麼在每個分區上應用您的唯一約束應該不是什麼大問題。較小的分區大小將使您的獨特約束更便宜。 (如果我錯了,我肯定會有人在這裏上學)。

我困在MySQL 5.0上。我正面臨手動將40M行的幾個表分區。我有一個文件ID,我可以在我的應用程序中散列:floor(docID/10)%100。這可以給我100個分區,並應顯著讓我的索引大小下來。我做對錶的查詢,並通過哈希計數的行數:

select count(docID), floor(docID/10)%100 as partno 
from documents 
group by partno 

幸運的是,我找到了我的第一次嘗試非常均勻分佈。你自己的公式將是不同的,我不知道你的分配將是什麼樣子。您是否擔心在分區面對你的唯一約束不上了呢?

如果你可以利用MySQL的分區,它會更強大和更小的應用程序產生影響。