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 存储为二进制的主要内容,如果未能解决你的问题,请参考以下文章

JAVA进阶:提高SQL性能的几种方法

使用 SQL 和 Java 程序提高性能

java面试题

java面试题

将数据从 EBS 移动到临时存储会提高 MySQL 查询性能吗?

提高查询性能mongodb