gpt4 book ai didi

php - 快速比较 MySQL 数据库中的随机字符串

转载 作者:行者123 更新时间:2023-11-29 08:18:40 29 4
gpt4 key购买 nike

我需要在数据库中存储 1000 个(很快可能是 100,000 个甚至数百万个)12 个字符的唯一随机字符串。每次我必须生成新代码(实际上是分批完成 10,000 多个)时,我都需要将其与现有数据库进行比较,以确保不会出现重复项 - 而且当代码被用户“兑换”时,我需要确保它存在。

这两项任务都可能非常慢,因此我希望尽可能简化它们。首先,我确保字符串以二进制格式存储在数据库上,并带有索引。这显然比 CHAR、VARCHAR 和 VARBINARY 更快。

我正在考虑尝试进行进一步的改进,并提出了这个简单的想法:将第一个字符作为 TINYINT 存储在索引列中,然后首先进行比较 - 从而希望更快地找到匹配的记录。

例如:

public function getFirstCharAsNum($code) {
$firstChar = substr($code, 0);
$firstCharHex = bin2hex($firstChar);
$prefix = hexdec($firstCharHex);
return $prefix;
}

public function isDuplicate($generatedCode) {

$result = false;

$params["code"] = $generatedCode;
$params["prefix"] = getFirstCharAsNum($generatedCode);

$STH = $this->_db->prepare("SELECT count(*) FROM codes
WHERE prefix = :prefix AND code = :code;");

try {
$result = $STH->execute($params);
} catch (PDOException $e) {
throw new Exception($e->getMessage());
}

$result = $STH->fetch(PDO::FETCH_COLUMN);

if($result) {
return true;
} else {
return false;
}

}

这个想法是,如果找到匹配项,它只会尝试 AND 运算的第二部分,并且搜索 TINYINT 应该比整个 BINARY(12) 列快得多。

这实际上更快吗?或者添加额外的查找会减慢我的速度吗?

谢谢。

最佳答案

I need to store 1000s (and possibly soon 100,000s maybe even millions) of unique random strings of 12 characters in a database

如果它们确实是随机的,则冲突的几率为{实际记录数}/{可能记录数}

即使如果您选择的字符集包含数字,那么对于 1000 万条现有记录,冲突的概率为 10,000,000/1,000,000,000,000 = 1/100,000,因此你所描述的实际上是浪费时间。在数据库中的值上添加唯一索引 - 如果您在尝试添加新值时遇到唯一约束违规,请重新生成该值。

(对于36个字符的轨道,碰撞的概率约为1/473,838,000,000)

关于php - 快速比较 MySQL 数据库中的随机字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20019396/

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