2011-08-02 38 views
1

將兩個INT主鍵(複合鍵)「打包」爲單個BIGINT主鍵是否高效?它可以在mySQL中自動完成還是需要在客戶端(PHP,C++)中完成?將`INT`主鍵包裝成單個`LONG`

我正在創建一個方向圖,在mySQL中將用戶ID互相連接(例如,用於朋友查找器)。

MySQL支持8字節BIGINT S和4字節INT S,所以封隔器可能看起來像:

id_edge = ((BIGINT)id_from)*pow(2,31) + ((BIGINT)id_to) 

如何的大男孩(FB,LI)辦呢?有三個「獨立」字段更容易或更好:

CREATE TABLE `things`.`connections` (
`id_edge` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'Need a single pk for gii\n' , 
`id_from` INT NOT NULL , 
`id_to` INT NOT NULL , 
.... 

回答

4

不可以。您不應該試圖微觀優化存儲。每列應存儲1條數據 - 不多也不少。

如果你實施了你建議的包裝,你會使索引變得不可能 - 要進行全表掃描才能找到例如與id_to等於所有行到19


您還可以閱讀Chapter 13 of the MySQL manual,其中討論了各種存儲引擎,以及如何實際存儲表數據。

+0

「*每列應存儲1條數據 - 不多也不少。*」 - 有一個例外,['SET'類型](http://dev.mysql.com/doc/refman/5.1 /en/set.html)。 – binaryLV

1

首先,如果您打算使用除了按位運算符之外的功能,它永遠不會高效。

//assuming int is 4 bytes 
$combined = ($a << 32) | $b 

即使在這種情況下,它可能不值得的開銷。

其次爲int的該尺寸是在像4個字節在32位和8個字節的不同的系統的不同之處64位系統

我想的MySQL已經爲存儲優化。不要在那裏爲你免費做一些事情。

爲了簡單或錯誤將進入你的代碼。