2016-11-14 57 views
0

我有这个表:的MySQL COUNT很慢

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 

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

我有一个运行时间非常缓慢的运行时间为10分钟以上的php进程。当我反复运行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 

我将不胜感激,可建议击败这个问题的任何的优化。

+3

在'property_title'和'property_value'上添加一个键。像这样的查询应该在1秒内运行。 –

+0

@Zamrony P. Juhara谢谢你们,这已经为我的查询时间创造了奇迹!我会标记Zamrony的答案,但直到我已经遵循了Juergen的建议,我才看到它。 – steelpush

+0

(不是答案,而是建议)由于'PRIMARY KEY'是'UNIQUE KEY','DROP'是冗余'UNIQUE(line_id)'。 –

回答

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 

您的查询,通过克林斯曼指出的那样,我相信,如果你property_titleproperty_value添加指数作为综合指数,如可以提高性能:

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

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