使用什么类型的ID以及如何将其存储在数据库中?

时间:2017-04-15 07:44:11

标签: php mysql database performance uniqueidentifier

我目前正在开发一个基于Web的新项目,其中包含各种类型的实体。这个服务可以通过REST API访问,我正在考虑端点,如:

api.example.com/users/{user_id}

为此,我认为用户的自动增量ID将是一个糟糕的方法,因为任何人都可以点击: api.example.com/users/1,然后是api.example.com/users/2api.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';

所以,我正在使用十六进制格式,但是以二进制形式存储它 这是一个好方法吗?

1 个答案:

答案 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对于大型表来说效率低下,以及围绕它的可能方式。