使用NOW()执行非常缓慢的MySQL更新
在过去的几天里,我观察到一个简单的更新查询执行得非常糟糕。更新时间范围从2.5秒到15秒。查询已工作性能极限(< 1秒)在过去的一年半之内,但突然开始出现在最后两天的性能下降。任何见解将不胜感激。使用NOW()执行非常缓慢的MySQL更新
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;
谢谢#Andreas。我所做的更改(除了外键),并已回来的关键路径查询。我现在保持在观察系统,具有已经10分钟了,我仍然没有看到mysql-slow日志中的有问题的查询,如果这能解决问题,请直到明天再回来。我仍然非常困惑,当系统出现时,这是如何突然冒出来的工作了好几个月,再次感谢 –
谢谢,这似乎是有效的,你对服务器的全局锁定的解释与观察行为相符,我也观察到系统的负载平均值相对较高这个查询是行为不端的(大约2.x),但是一旦我放弃了唯一的约束并将其改为PK,它就下降到预期的0.0x。非常感谢您的建议! –
任何更多的数据将不胜感激。例如EXPLAIN计划。任何额外的索引?表的统计数据? –
请添加查询的执行计划,“NOW”不应减慢查询速度。 – sagi
性能问题应该包括'EXPLAIN ANALYZE'和一些关于表格大小,索引,当前时间表现,期望时间等的信息。'Slow'是一个相对术语,我们需要一个真正的值来比较。 \t \t [** MySQL **](http://dba.stackexchange.com/questions/15371/how-do-i-get-the-execution-plan-for-a-view) –