2016-11-14 3 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 

который в настоящее время содержит около 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 

Я был бы признателен за любые оптимизации, которые могут быть предложены для взбивания этой проблемы.

+3

Добавить ключ на свойства 'property_title' и' property_value'. Запрос, подобный этому, должен пробежать менее 1 секунды. –

+0

@ Zamrony P. Juhara Спасибо, ребята, это произвело чудеса для моего запроса! Я хотел бы отметить ответ Замрони, но я не видел его, пока не последовал за советом Юргена. – 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_title и property_value в качестве составной индекс, такие как:

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

После этого, попытайтесь еще раз выполните EXPLAIN, чтобы подтвердить, что проблема с производительностью решена или нет.

Смежные вопросы