我目前正在开发一个基于Web的新项目,其中包含各种类型的实体。这个服务可以通过REST API访问,我正在考虑端点,如:
api.example.com/users/{user_id}
为此,我认为用户的自动增量ID将是一个糟糕的方法,因为任何人都可以点击:
api.example.com/users/1
,然后是api.example.com/users/2
,api.example.com/users/3
,等等。
现在,我正在考虑使用UUID,但我不知道这是不是一个好主意,因为它是VARCHAR(36)
。出于这些原因,当我在 INSERT 查询(我使用 MySQL )生成用户ID时,我会这样做:
unhex(replace(uuid(),'-',''))
有了这个,我将UUID转换成二进制文件。我正在数据库中存储BINARY(16)
。
当我想从数据库中检索信息时,我可以使用类似的东西:
SELECT hex(id), name FROM user;
和
SELECT hex(id), name FROM user WHERE hex(id) = '36c5f55620ef11e7b94d6c626d968e15';
所以,我正在使用十六进制格式,但是以二进制形式存储它 这是一个好方法吗?
答案 0 :(得分:0)
几乎那里......
索引是你的性能朋友。据推测,id
被编入索引,然后
WHERE id = function('...')
使用索引并直接进入行,但
WHERE function(id) = '...'
无法使用索引;相反,它扫描所有行,检查每一行。对于一张大桌子,这是一个很好的表。
因此...
用它来存储它:
INSERT INTO tbl (uuid, ...)
VALUES
(UNHEX(REPLACE(UUID(), '-', '')), ...);
这是为了测试它:
SELECT ... WHERE
uuid = UNHEX(REPLACE('786f3c2a-21f6-11e7-9392-80fa5b3669ce', '-', ''));
如果您选择发送(通过REST)没有破折号的32个字符,您可以计算出这种微小变化。
由于这很繁琐,因此需要构建一对存储函数。哦,我有一个给你;见http://mysql.rjweb.org/doc.php/uuid。 这也讨论了为什么UUID对于大型表来说效率低下,以及围绕它的可能方式。