[英]Optimizing table for performance
我有2個表供我使用的簡單解析器
CREATE TABLE IF NOT EXISTS `parsers` (
`parser_id` int(11) NOT NULL AUTO_INCREMENT,
`last_used` datetime NOT NULL,
`engine_id` int(11) NOT NULL,
`job_id` varchar(20) DEFAULT NULL,
`notice` text NOT NULL,
PRIMARY KEY (`parser_id`),
KEY `last_used_2` (`last_used`,`parser_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=167541 ;
CREATE TABLE IF NOT EXISTS `engines` (
`engine_id` int(11) NOT NULL AUTO_INCREMENT,
`ip` varchar(50) NOT NULL,
`status` int(11) NOT NULL,
`in_use` int(11) NOT NULL,
`last_used` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`engine_id`),
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1201 ;
基本上是解析器隊列。 以下查詢將作業分配給解析器
UPDATE parsers SET job_id = '$job_id', last_used = NOW() WHERE job_id IS NULL AND status = 1 AND engine_id IN(SELECT engine_id FROM engines WHERE in_use = 0) ORDER BY last_used ASC
然后,分配的作業將被提取以進行進一步處理:
SELECT * FROM parsers WHERE job_id = '$job_id'
我的問題是,當查詢上有多個解析器處於活動狀態時,UPDATE查詢將變得非常慢,該查詢有時需要10秒鍾才能執行,這是不可接受的,因為它會使所有操作減慢很多。
EXPLAIN向我展示了using where;using filesort
,我認為缺陷在於using filesort
。
我認為添加索引可以解決此問題並加快查詢速度。
我嘗試添加ALTER TABLE parsers ADD INDEX(last_used,parser_id)
,這提高了一段時間的性能,也使using filesort
消失了,但是正如我今天再次檢查的那樣, using filesort
又回來了,並且性能和以前一樣差。 該指數甚至正確嗎? 如何加快餐桌速度?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.