我经常有一个任务,我需要收集一个对象,在保存到DB(PostgreSQL)之前我需要知道它的ID。
我可以用UUID做到这一点,但它有很多缺点:
- 选择或包括时的性能较差
- 连接的性能较低
- 需要更多空间
问题是:如何预先为对象生成ID并最大限度地减少UUID的负面后果?
答案 0 :(得分:2)
我们在项目中遇到了这个问题。我进行了一些测试(大约4M行,如果我没记错的话),这表明与英特尔相比,uuids并没有真正击败PG的表现。使用uuids作为主键已有一段时间了,我会毫不犹豫地再次这样做。虽然,我必须补充一点,我们还没有看到它如何在大规模生产中发挥作用。
检查出来:http://www.codeproject.com/Articles/388157/GUIDs-as-fast-primary-keys-under-multiple-database
使用uuids的好处是你永远不必担心冲突。不好的事情:如果您手动输入测试查询,它们会有点麻烦。
如果您最终根据大量的uuids进行选择,请使用此技巧:https://www.datadoghq.com/blog/100x-faster-postgres-performance-by-changing-1-line/
希望这有帮助,
亚当。
答案 1 :(得分:0)
您可以使用任何编程语言中的任何uuid生成器来执行此操作。我建议在PostgreSQL中使用uuid类型,以避免在空间或连接时需要太多的开销。 PostgreSQL也没有包含生成这些的方法,所以你必须先生成它们。
您可能遇到的一个主要问题是,使用数字ID,许多事情相对轻松,成为uuids的一个更大的问题。其中包括:
但是如果在PostgreSQL中使用UUID类型,选择和连接性能应该不会太差。如何生成UUID取决于你作为程序员
答案 2 :(得分:0)
当然UUID应该在低于整数的性能下工作,问题在于哪个数据量。老实说,4M数据太小,无法说明是否会出现性能问题,当然,如果要求图像数据量仍小于4M,那就没问题。
在文档https://rclayton.silvrback.com/do-you-really-need-a-uuid-guid中,它建议更好地了解如何以及何时使用UUID