实现UUID以获得更好的性能

时间:2016-04-20 12:07:22

标签: java mysql performance uuid timeuuid

要求:
我们需要为商家分配一个随机的,足够长的数字/字符串,以便它们是唯一可识别的(不希望有人猜测标识符)。这是必需的,因为我们将此数字/字符串打印为QR码并将其提供给商家,以便我们的用户可以阅读QR码并获取有关商家的信息。

当前实施:
我们不能打印id,因为它们是顺序的,所以我们引入了一个新字段(externalId)来存储由JUG UUID生成器的TimeBasedGenerator生成的唯一id。随着我的研究越来越多,我发现UUID存在性能问题。所有文章都讨论了UUId作为主键,我没有使用UUID作为主键,而是作为辅助标识符。我并不担心插入和更新,因为与搜索相比它们会更少。由于用户将向我们发送从打印的QR码读取的UUID,我们将需要使用此UUID字段搜索商家,因此会对性能产生巨大影响。

按照我的解决方案:
而不是UUID,我们将提供ID:UUID的组合,以便当我们收到请求时,我们可以使用ID拆分和获取商家,并检查我们的数据库中存在的externalId(UUID)是否与提供的匹配,如果匹配我们不会回报商人。

此解决方案是否会显着提高性能,或者字符串操作所用的时间会使效果无效。

有没有更好的方法来做到这一点?

由于

2 个答案:

答案 0 :(得分:1)

UUID以各种风格生成。您可能已经知道,RFC 4122概述了定义五个不同版本的变体(即UUID模式)。我建议您查看RFC 4122的版本1

版本1使用生成UUID的机器的MAC地址作为生成的UUID的最后12位数。

假设你去了二手电脑回收商并购买了一个过时的以太网适配器;启动并获取该适配器的MAC地址;然后销毁适配器(碎纸机,射击枪,酸等)。您现在可以放心,宇宙中没有其他计算机会使用该MAC地址生成V1 UUID。

现在您可以编写一个UUID(RFC 4122,V1)生成器,它将使用收集的MAC地址。

您可以为每个商家收集一个单独的MAC地址(来自附加卡),然后您就可以识别为每个商家生成的UUID。

奖金: 您可以使用Mahonri Moriancumer's UUID and GUID Generator and Forensics 试用V1 UUID。

答案 1 :(得分:0)

最佳实现取决于您的UUID&S字符分布,但是在遇到类似情况时我所做的只是为最终用户使用UUID。在数据库中,我添加了一个列,其中填充了UUID的前2个字符,并为该列编制索引。

无论是这个还是,如您所建议的,ID都可以用于同一目的。索引部分UDID的好处是

  1. 您可以调整用于提高效果的字符数
  2. id不会被外部使用,可能导致问题。
  3. 另一方面,整数索引可能使用更少的内存而不需要tweeking

    性能方面,对于我的实施,我们面临的搜索查询为百万分之一,耗时7-8秒。使用此解决方案,我们降至几毫秒