将`INT`主键打包成一个`LONG`

时间:2011-08-02 06:56:07

标签: php mysql sql

将两个INT主键(复合键)“打包”到单个BIGINT主键中是否有效?它可以在mySQL中自动完成,还是需要在客户端完成(PHP,C ++)?

我正在创建一个方向图,在mySQL中将用户ID相互连接(例如,对于朋友发现者)。

MySQL支持8字节BIGINT和4字节INT,因此打包器可能类似于:

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 ,
....

2 个答案:

答案 0 :(得分:4)

没有。您不应该寻求微优化存储。每列应存储1个数据 - 不多也不少。

如果您实施了您提议的包装,则无法建立索引 - 需要进行全表扫描以查找例如id_to等于19的所有行。


您还可以阅读Chapter 13 of the MySQL manual,其中讨论了各种存储引擎及其实际存储表数据的方式。

答案 1 :(得分:1)

首先,如果您要使用除按位运算符以外的其他运算符,它永远不会有效。

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

即使在这种情况下,它也许不值得花费。

其次是int的大小在不同的系统中是不同的,例如32位的4字节和64位系统的8字节

我认为MySQL已经优化了存储。不要为你做免费的事。

简单或错误将会蔓延到您的代码中。