2016-12-03 5 views
1

У меня есть таблица MySQL, как это:MySQL - как ускорить SELECT SUM

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 

и приложение часто использует этот запрос:

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

, который занимает много времени.

Как я могу ускорить выполнение запроса? Спасибо

+1

(1) Что такое «долгое время»? (2) пожалуйста, приложите план выполнения –

+2

Для такого простого запроса, чтобы он был медленным, просто означает, что он выполняет полное сканирование таблицы. Первое, что приходит на ум, - это поставить уникальный объект на subject_id. – LukStorms

+0

@DuduMarkovitz: длительное время составляет около 0,5 с, что является одним из самых высоких значений в моем журнале SQL-запросов. –

ответ

3

Это ваш запрос:

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

Вы можете ускорить этот запрос с помощью составного индекса. Лучший индекс - goods_flog(subject_id, flow_value). Этот индекс является , охватывающим индекс для запроса, что означает, что все данные, необходимые для запроса, находятся в индексе, поэтому к исходным страницам данных не нужно обращаться.

+0

Pavel - будет 'flow_value' быть' UPDATEd' часто? Если это так, такой индекс может быть неразумным. Иначе это лучший показатель. –

0

Есть ли причина для порядка трех столбцов в PRIMARY KEY? Если нет, то перетасуйте их так, чтобы первым был subject_id. (И играйте со вспомогательными клавишами.)

Если он принимает 500 мс, чтобы читать 57 строк, то это звучит как очень холодный кэш. Что произойдет, если вы запустите его дважды подряд?

Какая ценность innodb_buffer_pool_size? Это соответствующий кэш. И сколько у вас RAM?