2011-01-09 109 views
1

此查询出现在mysql慢速查询日志中:需要11秒。为什么这个查询很慢?

INSERT INTO record_visits 
(record_id, visit_day) 
VALUES 
('567', NOW()); 

表有501043条记录,它的结构是这样的:

CREATE TABLE IF NOT EXISTS `record_visits` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `record_id` int(11) DEFAULT NULL, 
    `visit_day` date DEFAULT NULL, 
    `visit_cnt` bigint(20) DEFAULT '1', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `record_id_visit_day` (`record_id`,`visit_day`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; 

出了什么问题?为什么这个INSERT需要这么长时间?

UPDATE

我发现,什么是一切烦恼的原因。在该表上创建了一个非常沉重的“ON INSERT”触发器。与MyISAM表锁定一起,它为INSERT查询提供了巨大的查询时间。可能这就是为什么@Oswald在评论中无法再现这种情况。

这里真正的问题是,MySQL不会在触发器内部记录查询,并且在分析应用程序时总是必须记住它们。

感谢您的帮助,每个人都接受接近解决方案的答案。

+0

重新启动MySQL服务器的帮助吗? – 2011-01-09 18:29:00

+1

可能是因为你的唯一索引。但它不应该这么慢。 – alexn 2011-01-09 18:29:24

回答

2

我怀疑这不是查询本身很慢,而是在锁定表的服务器上运行其他查询。 MyISAM使用表级锁定,因此需要给定表的查询将锁定所有需要该表的其他查询,即使它们触及不同的行。例如,如果您经常有长时间运行的SELECT查询,则在您发出查询完成时,您的INSERT,UPDATE和DELETE查询将无法执行,直到正在运行的所有选择为止。

如果在插入运行时从另一提示中指定SHOW PROCESSLIST,则可能会看到它处于“锁定”状态。如果事实证明是另一种状态,并且没有长时间的选择阻止它,那么您应该发布该状态,因为这样可以帮助缩小问题的范围。

0

我不知道MySQL,但是UNIQUE KEY意味着visit_day列有索引吗?如果没有,请尝试创建一个。

1

我认为,当您尝试向此表中添加数据时,mysql会检查所有record_id_visit_day行,因为UNIQUE索引。