繁体   English   中英

使用 NOW() 的 MySQL 更新执行速度非常慢

[英]MySQL update using NOW() performing very slow

在过去的几天里,我观察到一个简单的更新查询表现非常糟糕。 更新时间范围为 2.5 秒到 15 秒。 该查询在过去一年半的时间里一直在性能限制( <1 秒)内工作,但在过去两天突然开始显示性能下降。 任何见解将不胜感激。

update user.auth_token 
set last_access_time = NOW() 
where token = '488f4f040090f1cb749e09a514d3dd3d';

该表仅包含 9 行并具有以下定义。

CREATE TABLE `auth_token` (
    `user_name` varchar(45) NOT NULL,
    `token` varchar(45) DEFAULT NULL,
    `last_access_time` datetime DEFAULT NULL,
    `creation_time` datetime NOT NULL,
    `token_type` varchar(45) NOT NULL,
    UNIQUE KEY `token_UNIQUE` (`token`),
    KEY `fk_user_name_idx` (`user_name`),
    CONSTRAINT `fk_user_name` FOREIGN KEY (`user_name`) 
        REFERENCES `user` (`name`) 
        ON DELETE CASCADE ON UPDATE CASCADE
) 
ENGINE=InnoDB DEFAULT CHARSET=utf8;

MySQL 版本为5.5.50-0ubuntu0.14.04.1-log

更新说明输出如下:

id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'SIMPLE', 'auth_token', 'const', 'token_UNIQUE', 'token_UNIQUE', '138', 'const', '1', ''

感觉令牌上的唯一键也可能是主键。

没有显式 PK 将导致 innoDB 向该表添加隐藏 PK,并使所有二级索引引用该隐藏 PK。

每当创建该 PK 时,它都会在服务器中进行全局锁定,从而使不相关的查询以难以发现的方式相互影响。

我还会尝试删除外键并再次执行相同的查询,以确保不会妨碍任何事情。

alter table auth_token add primary key (token),
                       drop key token_unique,
                       drop foreign key fk_user_name;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM