2016-03-21 4 views
0

私は約100,000のレコードを持つ以下のスキーマのようなテーブルを持っています。mysqlはsum()を得るのに長い時間がかかります

CREATE TABLE IF NOT EXISTS `order_items` (
    `order_item_id` int(1) unsigned NOT NULL AUTO_INCREMENT, 
    `item_id` int(1) unsigned DEFAULT '0', 
    `final_amt` double NOT NULL DEFAULT '0', 
    PRIMARY KEY (`order_item_id`), 
    KEY `item_id` (`item_id`), 
    KEY `final_amt` (`final_amt`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ; 

私は以下のクエリを実行すると

、それは約10とる(また、そこにいくつかの他のフィールドとインデックスがあることに注意してください。) - 20秒。

SELECT item_id, SUM(final_amt) AS tot_final_amt 
FROM `order_items` 
GROUP BY item_id; 

(約350の個別のitem_id値があります。)

私の結果はより速くするには?

+0

@ 1000111、 KEY item_id(item_id)は、item_id列のインデックスではありませんか? – asankasri

+0

申し訳ありませんが、私はそれを逃した。あなたの質問の「Explain」結果を共有してください。 – 1000111

答えて

0

フィルタ条件(WHERE)を使用しないため、テーブル全体をスキャンする必要があります。 WHEREを使用できない場合は、item_idごとにSUM()を格納する目的で新しいテーブルを作成する必要があります。 order_itemsが変更されるたびに、この新しいテーブルも更新する必要があります(たとえば、rgosegiのようにTRIGGERを使用します)。それは冗長ですが、私はこれがあなたの質問をスピードアップするために必要だと思います。

+0

あなたは、この解決策を助けることができる 'TRIGGER' – rkosegi

関連する問題