php - 将 `INT` 主键打包成单个 `LONG`

标签 php mysql sql

将两个 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/

相关文章:

php - Codeigniter min_length[] 不工作

php - mysql 改变表顺序不工作

php - 使用 or 运算符选择语句

MySql 数据库备份

javascript - PHP/MYSQL 中自动更改选项值

sql - oracle sql开发人员: 00904. 00000- "%s: invalid identifier"。我的错在哪里

php - SQL 选择用户

php - 违反完整性约束 : 1048 Column 'taggable_id' cannot be null

php - 更新多个字段时更新未推送到数据库

MySQL 用 Dateranges 计算两个表