Мне нужно хранить 1000-е (и, возможно, скоро 100 000 или, возможно, миллионы) уникальные случайные строки из 12 символов в базе данных. Каждый раз, когда мне приходится генерировать новый код (фактически выполняемый партиями в 10 000 + с), мне нужно сравнить его с существующей базой данных, чтобы убедиться, что не будет дубликатов, - но также когда код «выкуплен» пользователем, Мне нужно обеспечить его существование.Быстрое сравнение случайных строк в MySQL DB
Обе эти задачи, вероятно, будут очень медленными, поэтому я хочу сделать их максимально упрощенными. Для начала я убедился, что строки хранятся в формате BINARY в БД с индексом на них. Это, очевидно, быстрее, чем 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;
}
}
Идея заключается в том, что он будет пытаться второй частью операции И если он находит совпадение, и поиск TINYINTs должен быть намного быстрее, чем в целом BINARY (12).
Действительно ли это быстрее? Или добавляет дополнительный поиск, чтобы замедлить меня?
Спасибо.
'Сохранение первого символа в качестве TINYINT и сравнения, что во-первых, таким образом, надеяться, находя соответствие записей faster.' MySQL будет делать работа. (Вот почему вы создали индекс) – hek2mgl
Вы слишком задумываетесь об этом ... –
@ hek2mgl Но не помещал ли индекс в столбец TINYINT еще быстрее? :) –