2012-12-29 62 views
3

我正在創建一個Innodb表格,有四列。MySQL Innodb:大型複合PK沒有其他索引

column_a (tiny_int) 
column_b (medium_int) 
column_c (timestamp) 
column_d (medium_int) 

Primary Key -> column_a, column_b, column_c 

從邏輯的角度看,列A,B,C必須被製作成PK together.However,以提高性能,並能直接從索引讀取(使用索引)我我正在考慮一個由所有4列(A,B,C,D)組成的PK。

問題

會表現爲附加額外的列上一個InnoDB表的主鍵是什麼?

注意事項

  • 代理主鍵是絕對不可能
  • 沒有其他的指標將在此表中存在的
  • 表讀/寫密集型(均爲約等於)

謝謝!

+2

將'column_d'添加到您的PK中意味着只要'column_d'不同,就可以在'(column_a,column_b,column_c)'中具有相同值的多個記錄。另外,爲什麼不能在表中添加其他索引:如果你想要一個覆蓋索引,爲什麼不加一個*除了PK?請記住,**過早優化是所有惡意的根源** - 您是否真的遇到了您想要解決的性能問題?如果是這樣,那是什麼? – eggyal

+0

用'column_d'非常好的一點,我問是否有一個經驗法則或一些指導原則。有很多桌子有大PK,我希望得到指導。謝謝 – ProfileTwist

回答

0

有幾件事情要考慮:

  1. 除非有問題的查詢使用的所有索引列,該索引將不會被使用。
  2. 作爲jeremycole說明:在Innodb的結構中的所有行的數據被存儲在聚集索引的B樹的葉節點(PRIMARY INDEX)

這一概念涵蓋: http://www.innodb.com/wp/wp-content/uploads/2009/05/innodb-file-formats-and-source-code-structure.pdf HTTP://博客.johnjosephbachir.org/2006/10 /第22 /一切任您需要到專門約 - 設計 - 的mysql-InnoDB的-主鍵/

...這裏在傑里米的博客文章: http://blog.jcole.us/2013/01/07/the-physical-structure-of-innodb-index-pages/

因此,對A,B,C w的查詢不足以有效獲得Innodb表上的所有價值。

+1

對不起,但這個答案只是不正確。InnoDB中的PRIMARY KEY索引結構包含所有非鍵字段作爲其「值」,這意味着沒有單獨的「數據」結構(例如MyISAM .MYD文件就是這種情況)。爲這種情況創建一個單獨的覆蓋索引將造成更多的傷害而不是好的。 – jeremycole

+0

傑里米是絕對正確的,關於我以前的不正確答案。 – Drew

1

在InnoDB中,PRIMARY KEY索引結構包含所有非關鍵字段,並將自動使用它們來覆蓋索引查詢和行消除。除了PRIMARY KEY索引結構之外,沒有單獨的「數據」結構。沒有必要爲PRIMARY KEY定義本身添加額外的字段。請注意,它在InnoDB表上使用PRIMARY KEY時不會顯示Using index,因爲它是不會觸發添加該消息的不同代碼路徑。

+0

..因爲...? –

+0

@ypercube哈哈,沒有注意到那裏的尾隨...... – jeremycole