将两个 INT
主键(复合键)“打包”成单个 BIGINT
主键是否有效?可以在 mySQL 中自动完成还是需要在客户端(PHP、C++)中完成?
我正在 mySQL 中创建一个将用户 ID 相互连接的方向图(例如,用于寻找 friend )。
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 ,
....
最佳答案
没有。您不应该寻求对存储进行微优化。每列应存储 1 条数据 - 不多也不少。
如果您实现了您建议的打包,您将无法建立索引 - 需要全表扫描才能找到例如id_to
等于 19 的所有行。
您还可以阅读 Chapter 13 of the MySQL manual ,其中讨论了各种存储引擎以及它们实际存储表数据的方式。
关于php - 将 `INT` 主键打包成单个 `LONG`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6908307/