2016-11-14 10 views
0

非常に遅くCOUNT:現在11万レコードを含むMySQLは、私は、このテーブルを持っている

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 

を、しかし、はるかに大きくなります。

私は非常に遅く実行しているこのテーブルに対して実行している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ありがとう、これは私のクエリ時間の驚異を働いています!私はZamronyの回答を受け入れてもらえますが、私はすでにJuergenのアドバイスを続けていない限り、私はそれを見ませんでした。 – steelpush

+0

(答えではないが、アドバイス) 'PRIMARY KEY'は'ユニークキー 'なので、' DROP'は冗長 'UNIQUE(line_id)'です。 –

答えて

1

最初の手順で問題を特定します。その後

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

にしてみてください:ユルゲンで指摘したように、クエリの

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にインデックスを追加する場合は、パフォーマンスを向上させることができると信じてもう一度EXPLAINを実行して、パフォーマンスの問題が解決されたかどうかを確認してください。

関連する問題