введение
Я делаю запрос несколько раз (один запрос на «услугу» в заданном месте).Запрос, результаты производительности и размер набора данных приведены ниже.Пожалуйста, дайте мне совет о том, как оптимизировать производительность.Спасибо
размер набора данных
- таблица служб: 8 тысяч строк
- how_rates_policies: 0,2 миллиона строк
- how_rates: 1,7 миллиона строк
результаты производительности
Ботсвана
- Количество услуг: 4
- Задержка: 7сек
- Задержка на услугу: около 2 с/ услуга
Кейптаун, КБР
- Количество услуг: 34
- Задержка: 4,5 минуты
- Задержка на услугу: около 7 с/ service
query
DELIMITER $$
CREATE DEFINER= [i removed the db user name here to censor it] PROCEDURE `spx_GetRatesForProduct`(productId INT, priceCode VARCHAR(2), inDate DATETIME, outDate DATETIME)
BEGIN
DECLARE endRateDate DATETIME;
SET endRateDate := (SELECT MAX(date_to)
FROM how_rates_policies hrp
WHERE hrp.product_id = productId and hrp.price_code = priceCode and hrp.date_to >= outDate);
-- SELECT endRateDate = IFNULL(endRateDate, '19700101');
IF endRateDate = '19700101' THEN
SELECT * FROM how_rates_policies hrp INNER JOIN how_rates hr ON hrp.id = hr.what_rates_policies_id
WHERE hrp.product_id = productId
AND hrp.price_code = priceCode
AND hrp.date_from <= inDate
AND hr.rate_category = 'VAL'
ORDER BY hrp.date_to;
ELSE
SELECT * FROM how_rates_policies hrp
INNER JOIN how_rates hr
ON hrp.id = hr.what_rates_policies_id
WHERE hrp.product_id = productId
AND hrp.price_code = priceCode
AND hrp.date_from <= outDate
AND hrp.date_to >= inDate
AND hrp.date_to <= endRateDate
AND hr.rate_category = 'VAL'
ORDER BY hrp.date_to;
END IF;
END$$
DELIMITER ;