2011-01-09 134 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索引。