gpt4 book ai didi

mysql - DB超时或执行时间较长

转载 作者:行者123 更新时间:2023-11-29 09:34:52 24 4
gpt4 key购买 nike

我正在处理的一个非常具体的过程遇到问题,要么需要大约 45 秒才能运行,要么需要几分钟才能完成。我知道问题是什么,但老实说,目前我不确定如何解决它。在 SP 中,您将看到一个注释掉的部分 (while block),它基本上是创建一个要插入到表中的 token ,目前我只插入 TEST 来绕过阻塞问题。

这是当前的工作版本,只需插入一个虚拟值即可正常运行。

BEGIN
DECLARE userexist INT(1);
DECLARE tokenID VARCHAR(12) default '';
DECLARE rnd_str text;
DECLARE ready int default 0;
DECLARE userID INT(20) default 0;
DECLARE lastID int default 0;

SELECT
su.User_ID,
1 AS user_exist
INTO userID, userexist
FROM System_User su
WHERE AES_DECRYPT(su.User_Email, 'AAAA') = email
AND AES_DECRYPT(su.User_Password, 'AAAA') = userpassword
AND su.User_Is_Active = 1;

IF userexist = 1 THEN

UPDATE System_User_Login
SET System_User_Login.System_Logout_Time = NOW(),
System_User_Login.System_Logout_Type = 1
WHERE System_User_Login.System_Login_User_ID = userID;

SET tokenID = 'TEST'; -- dummy value for now

INSERT INTO System_User_Login(System_Login_Time, System_Login_Token, System_Login_User_ID, System_Token_Valid_Period)
VALUES(NOW(), tokenID, userID, (NOW() + INTERVAL 30 DAY));

SET lastID = LAST_INSERT_ID();

-- WHILE ready = 0 DO
-- SET rnd_str = lpad(conv(floor(rand()*pow(36,16)), 12, 36), 12, 0);
-- IF NOT EXISTS (SELECT 1 FROM System_User_Login sul WHERE sul.System_Login_Token = rnd_str) THEN
-- update System_User_Login
-- SET System_Login_Token = rnd_str
-- WHERE System_Login_ID = lastID;

-- SET ready = 1;
-- END IF;
-- END WHILE;

SELECT
sul.System_Login_Token AS Token
FROM System_User_Login sul
WHERE sul.System_Login_ID = lastID;

ELSE
SELECT '0' AS Token;
END IF;

END

该过程中的 while 循环是创建一个要分配的新 token ;我在插入之前和之后都尝试过,但没有成功;甚至触发。我一定不会看到某些东西,或者需要重新考虑我的方法。

最佳答案

如果您的用户列表很高,那么这种冲突的可能性就会增加。这将导致多次迭代。您可以通过以下方式避免这种情况

1:如果使用 MySQL 8,您可以使用通用唯一标识符,但请确保长度限制符合您的要求。

2:尝试以下操作

Unique Identifier = CONCAT(<some_random_string>, unix_timestamp, <primary_key_id>)因此,如果您要为 user = 4 设置 token 那么

SELECT LPAD(CONCAT(CONV(FLOOR(RAND()* POW(36,16)), 12, 36), UNIX_TIMESTAMP(), '4'), 25, 0);
  • 如果您在一秒内没有生成多个 token ,则 UNIX_TIMESTAMP将会使它独一无二。
  • 此外,如果我们每秒生成多个 token ,那么我们可以通过使用 CONV(FLOOR(RAND()* POW(36,16)), 12, 36) 生成随机数来减少冲突。
  • 如果碰巧它为多个用户生成相同的随机字符串,我们就会为每个用户提供一个唯一的 ID,这肯定会使其独一无二。

假设:您不会在一秒钟内为同一用户创建多个 token ,否则可能会发生冲突。

注意:如果您使用第二种方法,则可以在完整过程中使用两个 SQL 语句。这是a way

关于mysql - DB超时或执行时间较长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57845644/

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