MySQL COUNT非常慢

时间:2016-11-14 10:40:41

标签: mysql optimization

我有这张桌子:

CREATE TABLE `pertemba_client_raw_data` (
  `line_id` int(11) NOT NULL AUTO_INCREMENT,
  `feed_id` int(11) NOT NULL COMMENT 'References pertemba_client_feed_log.feed_id',
  `data_line` int(11) NOT NULL COMMENT 'Eg. The CSV line number or JSON object index.',
  `property_title` varchar(255) NOT NULL COMMENT 'Eg. The CSV header or JSON key.',
  `property_value` varchar(255) NOT NULL COMMENT 'Eg. The CSV field value or JSON object value.',
  `date_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`line_id`),
  UNIQUE KEY `pertemba_client_raw_data_line_id_pk` (`line_id`),
  KEY `feed_id` (`feed_id`),
  CONSTRAINT `pertemba_client_raw_data_ibfk_1` FOREIGN KEY (`feed_id`) REFERENCES `pertemba_client_feed_log` (`feed_id`)
) ENGINE=InnoDB AUTO_INCREMENT=113121 DEFAULT CHARSET=utf8

目前包含约110,000条记录,但会变得更大。

我有一个针对此表运行的php进程,运行速度非常慢 - 运行时间目前为10分钟以上。当我反复运行show PROCESSLIST;时,此过程中的查询始终在运行:

SELECT COUNT(pcr.line_id) AS result FROM pertemba_client_raw_data AS pcr
            WHERE pcr.feed_id = :feedId
            AND pcr.property_title = :title
            AND pcr.property_value = :optionLink

我希望能够提出任何可以解决这个问题的优化措施。

1 个答案:

答案 0 :(得分:1)

第一步是确定问题。试试

EXPLAIN SELECT COUNT(pcr.line_id) AS result 
         FROM pertemba_client_raw_data AS pcr
         WHERE pcr.feed_id = :feedId
         AND pcr.property_title = :title
         AND pcr.property_value = :optionLink

对于您的查询,正如juergen所指出的,如果您将索引添加到property_titleproperty_value作为复合索引,我相信您可以提高性能,例如:

KEY `feed_id` (`feed_id`, `property_title`, `property_value`)

之后,尝试再次执行EXPLAIN以确认性能问题是否已解决。