2010-10-28 58 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) 

感谢大家对你的建议:)