我继承了一个使用 32 字节十六进制字符串集来尝试唯一标识对象的数据库。每个字符串称为一个指纹,每个对象最多可以有 20 个指纹。
我正在跨服务器迁移数据库,我注意到重新填充指纹表需要几个小时。似乎每个指纹都有一个整数 id 并存储为 varchar,指纹列上有一个索引,因此插入速度很慢。
我的问题是:重构这个设计并完全移除指纹表是否值得我花时间?我猜想对数字而不是字符串进行索引会更快,这是正确的吗?
如果设计看起来像这样:(希望这是有道理的)
Object(1,*)<----->(*,*)ObjectFingerprint(*,*)<------>(1,*)Fingerprint
id object_id id
fingerprint_id fingerprint
Run Code Online (Sandbox Code Playgroud)
最好使用:
Object(1,*)<----->(*,*)Fingerprint
id object_id
fingerprint
Run Code Online (Sandbox Code Playgroud)
我正在使用带有 INODb 表的 MySQL 服务器,并且我有大约 140 万个对象。
我建议使用 BINARY 类型;字符串浪费大量空间,整数需要转换。
http://dev.mysql.com/doc/refman/5.0/en/binary-varbinary.html
另一方面:为什么需要关联表?如果对象和指纹是 1 比 1,您可以将它们直接存储在对象表中,或者只有一个带有 id、指纹和对象 id FK 的表。