2016-03-21 12 views
0

Ich habe eine Tabelle wie in unten Schema, die etwa 100.000 Datensätze haben.mysql nehmen lange Zeit, um 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 ; 

(Bitte beachten Sie, dass es einige andere Felder und Indizes auch.)

Wenn ich die unten Abfrage ausführen, ist es etwa 10 stattfindet - 20 Sekunden.

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

(Es gibt etwa 350 verschiedene item_id Werte.)

Wie mein Ergebnis schneller machen?

+0

@ 1000111, KEY item_id (item_id), ist das kein Index für die Spalte item_id? – asankasri

+0

Entschuldigung, das habe ich verpasst. Bitte teilen Sie das 'Explain'-Ergebnis Ihrer Anfrage mit. – 1000111

Antwort

0

Sie verwenden keine Filterkriterien (WHERE), so dass die ganze Tabelle gescannt werden muss. Wenn Sie WHERE nicht verwenden können, müssen Sie eine neue Tabelle mit dem Zweck erstellen, SUM() für jede item_id zu speichern. Jedes Mal, wenn order_items geändert wird, müssen Sie auch diese neue Tabelle aktualisieren (z. B. mit TRIGGER, wie von rkosegi vorgeschlagen). Es ist überflüssig, aber ich denke, dies ist erforderlich, um Ihre Anfrage zu beschleunigen.

+0

Vielleicht möchten Sie "TRIGGER's" erwähnen, die bei dieser Lösung helfen können – rkosegi