簡體   English   中英

優化性能表

[英]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又回來了,並且性能和以前一樣差。 該指數甚至正確嗎? 如何加快餐桌速度?

索引的一般規則是,您需要它們滿足您的WHERE條件,如果重要的話,請在以后包括與ORDER相關的所有內容。

在您的情況下,您需要一個包含parser_id的索引,因為這是查詢中唯一出現的內容。 last_used,parser_id上的索引對此查詢無用。

需要注意的是,如果您試圖在MySQL中建立作業隊列並且需要最大的性能,那么您將面臨艱巨的挑戰。 更好的選擇包括RabbitMQ作為隊列解決方案,或Redis作為高速數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM