簡體   English   中英

mysql主鍵問題

[英]mysql primary key question

在3個或4個字段上具有主鍵的最佳狀態是什么? 如果表中包含數百萬條記錄,那么在運行查詢的服務器上它會變得很繁重,例如:

Select * from my_table where field1='123' and field_2='123' and field_3='hours'

在以下字段上創建主鍵:field_1 int(11)field_2 int(11)field_3 varchar(20)

我正在考慮的替代方法是讓那些字段將主鍵的數據存儲在單獨的字段中,該字段具有md5數據哈希值,例如“ md5(field_1 +'-'+ field_2 +'-'++ field_3)和然后我的腳本只查詢一個字段,例如:

Select * from my_table where field_hash=MD5('123-123-hours')

因此,基本上,我只是想知道方法1是否與具有數百萬條記錄的表的方法2一樣最佳。

我想您最好的選擇是使用代理自動遞增字段作為PK。 如果失敗,我將只使用三個字段。

md5哈希值似乎並不值得。 在任何情況下,我都真的看不到這種方法的好處。 不要試圖超越數據庫引擎。 如果哈希確實更快,那么索引引擎將以這種方式在內部為復合鍵實現。 不是,它應該告訴您一些信息。

使用代理鍵,您可以獲得更快的聯接;使用組合鍵,當查詢僅返回作為主鍵(覆蓋索引)一部分的字段時,您將獲得一些性能優勢。

您可以從以下問題的答案中了解有關復合鍵性能的信息:MySQL中的復合主鍵性能缺點

在進行這種優化之前,您應該始終測量效果。 也就是說,創建兩個具有相同數據的表,一個使用復合鍵,另一個使用哈希,然后嘗試在您的用例中哪個更有效。

通常,如果不是絕對必要的話,我不喜歡使用無意義的鍵值。 如果將哈希用作主鍵,則意味着數據庫用戶必須知道ID生成過程。 從長遠來看,這將導致更多文檔(將不會被閱讀)以及錯誤。

如果有可能進一步規范化數據庫,則可能不想使用組合鍵。 復合鍵是否代表不同的實體,它是否應該真正構成第二個表,您可以在其中將代理鍵附加到列集?

另一種選擇是在當前表中使用代理鍵,然后對當前組合鍵設置唯一約束,例如

create table 
   id int(11) primary key,
   field1 int(11), 
   field_2 int(11), 
   field_3 varchar(20), 
   constraint uq_composite unique (field1, field_2, field_3);

我會盡量避免使用非順序主鍵(即字符串或隨機生成的數字),因為這會導致磁盤上的I / O增多並降低某些存儲引擎(尤其是MyISAM)的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM