gpt4 book ai didi

php - 使用最少的资源使用数据库检查唯一的随机值

转载 作者:行者123 更新时间:2023-11-29 11:41:03 25 4
gpt4 key购买 nike

这更像是一个最佳实践问题。我正在使用以下参数生成一个随机字符串标识符:

  • 长度:7 个字符
  • 种子:A-Za-z0-9(小写字母+大写字母和数字)

在插入该字符串之前,我需要检查数据库中是否存在该字符串。我可以通过两种方式做到这一点:

  1. 运行 do...while 循环。在其中生成一个随机字符串,每次都使用 COUNT(*) 查询数据库,直到 count === 0
  2. 首先通过单个查询从数据库中获取所有现有的唯一字符串,然后运行 ​​do...while 循环来生成不在提取的数组中的随机字符串。

对我来说很明显,第二种方法在技术上对数据库服务器的资源密集程度较低,因为只有一个查询,而不是一遍又一遍地查询。所以我倾向于这种方法,但我看到两个潜在的警告:

大型数据库,以及获取和插入之间的时间间隔。

  • 大型数据库结果:在我需要考虑切换到第一种方法之前,查询结果中可以有多少行?换句话说,什么时候数据库服务器上的大型结果集的压力低于运行多个后续查询? 1,000 个结果? 5,000?两万?

  • 获取和插入之间的时间:如果我使用第二种方法,当两个或多个用户尝试同时运行相同的函数时,我会发现存在风险。第一个用户的结果集(从数据库获取的唯一字符串)可能不包括查询后 2 毫秒刚刚添加的其他用户的唯一字符串。这可能会在数据库中产生重复项。

第二种方法在生产中实际上可行,还是只是一个梦想?

最佳答案

第二个选项对我来说似乎不太实用。如果表中只有几行,则冲突的风险较低,如果有很多行,则冲突的风险会增加,但在 php 端获取所有行的内存效率不高。

第一个解决方案对我来说似乎更好。

但我认为可以使用第三种选择。在 MySQL 中为随机值添加唯一索引。生成一个随机值,然后尝试插入它。如果发生碰撞,捕获错误。这是高效的,因为 MySQL 在索引某个值时可以快速检查该值是否存在。使用此方法不会出现并发问题。

唯一需要注意的是(对于所有方法),当表中的行数很高时,您将很难找到尚未使用的值。为了降低碰撞风险,您可以增加随机值的大小。您还可以创建另一个包含未使用值的表,并在值太少时使用其他算法填充该表。

关于php - 使用最少的资源使用数据库检查唯一的随机值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35772147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com