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

标签 php mysql database performance uniqueidentifier

我目前正在开发一个包含各种类型实体的基于网络的新项目。该服务可通过 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 查询上生成用户 ID 时,我会执行类似的操作(我使用的是 MySQL):

unhex(replace(uuid(),'-',''))

这样,我将 UUID 转换为二进制。我正在存储一个 BINARY(16)而是在数据库上。

当我想从数据库中检索信息时,我可以使用类似的东西:

SELECT hex(id), name FROM user;

SELECT hex(id), name FROM user WHERE hex(id) = '36c5f55620ef11e7b94d6c626d968e15';

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

最佳答案

几乎就在那里...

索引是您的性能 friend 。大概id已被索引,那么

WHERE id = function('...')

使用索引并直接转到行,但是

WHERE function(id) = '...'

不能使用索引;相反,它会扫描所有行,检查每一行。对于一张大 table 来说,这太慢了。

所以...

用它来存储它:

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 对于大型表来说效率低下,以及解决它的可能方法。

关于php - 使用什么样的 ID 以及如何将其存储在数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43423571/

相关文章:

php - SQLSTATE[HY093] : Invalid parameter number: parameter was not defined

php - number_format() php 删除尾随零

php - 列计数错误与第 1 行的值计数不匹配,错误仍然存​​在

php - PHP 7.0.20:异常的代码为0

php - 在 MySQL/PHP 中存储用户 BIRTHDATES 的最佳方式是什么?

mysql - postgresql 中的 DATE_FORMAT

javascript - 我如何使用php逐行从动态表中获取数据

mysql - 优化 MySQL 导入(将详细的 SQL 转储转换为快速的一个/使用扩展插入)

python - 使用 MySQL 在 Python 中进行高效的子字符串搜索

database - Zend_Db_Table : What happens when insert results in an error?