2010-10-28 79 views
11

我注意到我的腳本變得非常慢,於是我縮小了這個問題:它是一個更新查詢。奇怪的是,SELECT查詢速度非常快。該表有大約600,000個條目。是的,id是唯一的主鍵。下面是一些例子:極慢的UPDATE查詢

SELECT * FROM `tmp_pages_data` WHERE id = 19080 LIMIT 0 , 30 

Showing rows 0 - 0 (1 total, Query took 0.0004 sec) 

而現在的更新查詢:

UPDATE tmp_pages_data SET page_status = 1 WHERE id = 19080 

1 row(s) affected. (Query took 24.5968 sec) 

正如你所看到的,選擇是非常快的,但更新慢veery。這怎麼可能?

+0

請添加模式的結構,尤其是索引。編寫索引大小和引擎類型 – 2010-10-29 00:01:37

+0

好吧,這裏是表格的樣子:CREATE TABLE IF NOT EXISTS'tmp_pages_data'( 'id' int(10)unsigned NOT NULL AUTO_INCREMENT, 'site_id' int(11) DEFAULT NULL, 'url' VARCHAR(255)DEFAULT NULL, 'date_added'日期時間DEFAULT NULL, 'page_status' TINYINT(4)DEFAULT NULL, 'page_type' VARCHAR(255)DEFAULT NULL, 'title_normal' VARCHAR( 255)DEFAULT NULL, 'cat_id' INT(11)DEFAULT NULL, 'title_id' INT(11)DEFAULT NULL, PRIMARY KEY('id') KEY'url'('url') )ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 658002; – okaybmd 2010-10-29 00:13:21

+0

索引:PRIMARY(BTREE)獨特:是包裝:否\t字段:編號\t基數:658001整理:A \t無:無;指數:網址(BTREE)\t獨特:沒有\t包裝:沒有\t現場:URL \t基數:658001 \t整理:一\t空:是 – okaybmd 2010-10-29 00:13:49

回答

1

是的,這很奇怪。唯一我能想到的是tmp_pages_data表被其他事務鎖定,或者id = 19080行被其他事務鎖定。

另一個(不大可能的事情)是,你有一個page_status索引需要更新UPDATE句子,並且該部分需要花費大量時間來執行。

+0

實際上,我在page_status上有索引,但刪除了它 – okaybmd 2010-10-28 23:55:44

+0

嗯......不,這不是原因。我認爲索引可能沒有被「正確」刪除,但事實並非如此。我做了一個測試:UPDATE tmp_pages_data SET cat_id = 1 WHERE id = 19080 - > 1 row(s)affected。 (查詢耗時4.7825秒)所以還是很多時間(並且cat_id上沒有索引,從來沒有一個) – okaybmd 2010-10-29 00:05:25

-1

好的,完成了!

我不得不重啓Apache,現在它工作得很好(實際上我重啓了Ubuntu)!

UPDATE tmp_pages_data SET page_status =1 WHERE id =19080 

1 row(s) affected. (Query took 0.0004 sec) 

感謝大家對你的建議:)