2016-12-03 2 views
1

Ich habe eine MySQL-Tabelle wie folgt aus:MySQL - wie SELECT SUM zu beschleunigen

CREATE TABLE `goods_flow` (
`cycle_id` int(11) NOT NULL, 
`subject_id` varchar(45) COLLATE utf8_unicode_ci NOT NULL, 
`origin_id` int(11) NOT NULL, 
`flow_value` int(11) NOT NULL, 
PRIMARY KEY (`cycle_id`,`origin_id`,`subject_id`), 
KEY `fk_goods_flow_subjects` (`subject_id`), 
KEY `fk_goods_flow_origins` (`origin_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

und die Anwendung verwendet oft diese Abfrage:

SELECT SUM(flow_value) AS 'amount_of_goods' FROM goods_flow WHERE subject_id = 'xyz'; 

das eine lange Zeit in Anspruch nimmt.

Wie könnte ich die Abfrageausführung beschleunigen? Danke

+1

(1) Was ist "lange Zeit"? (2) bitte fügen Sie den Ausführungsplan bei –

+2

Damit eine solche einfache Abfrage langsam ist, bedeutet sie nur, dass sie einen vollständigen Tabellenscan durchführt. Das erste, was mir in den Sinn kommt, ist, einen nicht eindeutigen Index auf subject_id zu setzen. – LukStorms

+0

@DuduMarkovitz: lange Zeit ist etwa 0,5 s, das ist einer der höchsten Werte in meinem SQL-Abfragen-Protokoll. –

Antwort

3

Das ist Ihre Abfrage:

SELECT SUM(flow_value) AS amount_of_goods 
FROM goods_flow 
WHERE subject_id = 'xyz'; 

Sie können diese Abfrage beschleunigen, indem Sie einen zusammengesetzten Index. Der beste Index ist goods_flog(subject_id, flow_value). Dieser Index ist ein , der den Index für die Abfrage abdeckt. Dies bedeutet, dass alle von der Abfrage benötigten Daten im Index enthalten sind, sodass auf die ursprünglichen Datenseiten nicht zugegriffen werden muss.

+0

Pavel - wird 'flow_value'' 'UPDATEd'' sein häufig? Wenn dies der Fall ist, ist ein solcher Index möglicherweise nicht sinnvoll. Sonst ist es der beste Index. –

0

Gibt es einen Grund für die Reihenfolge der 3 Spalten in der PRIMARY KEY? Wenn nicht, dann mischen Sie sie so, dass subject_id zuerst ist. (Und Geige mit den sekundären Tasten.)

Wenn es dauert 500ms, 57 Zeilen zu lesen, dann klingt es wie ein sehr Cold-Cache. Was passiert, wenn Sie es zweimal hintereinander ausführen?

Was ist der Wert von innodb_buffer_pool_size? Es ist der relevante Cache. Und wie viel RAM hast du?