Java EE/JPA:提高查询性能 - 将 UUID 存储为二进制
Posted
技术标签:
【中文标题】Java EE/JPA:提高查询性能 - 将 UUID 存储为二进制【英文标题】:Java EE/JPA: Improve query performance - store UUID as binary 【发布时间】:2014-07-23 11:28:23 【问题描述】:我想将 UUID 用作主要,因为这些主要是全球唯一的,这使得(例如)可以轻松地将生产环境中的数据集成到正在运行的调试环境中。
关于以下文章:http://iops.io/blog/storing-billions-uuid-fields-mysql-innodb SELECT/INSERT 使用解码为 BINARY(16) 的 UUID 将数百万条记录SELECT/INSERT 比使用简单的 CHAR(36) 快得多。
现在,使用 Hibernate @GenericGenerator 注解,我可以使用这个原生 UUID 生成器作为使用 UUID 的主键:
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id;
另一方面,我可以将二进制 UUID 定义为主要的,如下所示:
@Id
@Getter
@Column(columnDefinition = "BINARY(16)", length = 16, updatable=false, nullable=false)
private byte[] id;
... 并使用 @PrePersist 生成新的 UUID
@PrePersist
private void prePersist()
if (this.id == null)
this.generateUUID();
此解决方案的问题在于(本地/命名)查询中过滤器的二进制表示:
SELECT * from object o WHERE o.id=:id
我真正需要的是能够将上述 UUID 字段作为 BINARY 存储在数据库中,同时将值表示为简单的 UUID-String。
有没有办法做到这一点?有没有其他选择?
【问题讨论】:
【参考方案1】:为什么不直接为列使用特殊的 uuid 类型?
@Type(type = "pg-uuid")
但是我在这样做时也遇到了原生查询的问题。
【讨论】:
以上是关于Java EE/JPA:提高查询性能 - 将 UUID 存储为二进制的主要内容,如果未能解决你的问题,请参考以下文章