SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 10.01.2018 18:33:36

owner.coder
Участник
Зарегистрирован: 10.01.2018
Сообщений: 2

Время выполнения запроса

Добрый день! Помогите пожалуйста понять и исправить проблему со временем выполнения запроса, есть следующие две таблицы:


CREATE TABLE `financial` (
  `financial_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `site_id` int(11) unsigned NOT NULL,
  `initial_count` smallint(128) NOT NULL DEFAULT '0',
  `initial_money` decimal(8,2) NOT NULL DEFAULT '0.00',
  `recurring_count` smallint(128) NOT NULL DEFAULT '0',
  `recurring_money` decimal(8,2) NOT NULL DEFAULT '0.00',
  `refund_count` smallint(128) NOT NULL DEFAULT '0',
  `refund_money` decimal(8,2) NOT NULL DEFAULT '0.00',
  `chargeback_count` smallint(128) NOT NULL DEFAULT '0',
  `chargeback_money` decimal(8,2) NOT NULL DEFAULT '0.00',
  `created` datetime DEFAULT NULL,
  PRIMARY KEY (`financial_id`),
  KEY `financial-created` (`created`),
  KEY `fk-financial-site` (`site_id`),
  KEY `created_site_id` (`created`,`site_id`),
  CONSTRAINT `fk-financial-site` FOREIGN KEY (`site_id`) REFERENCES `site` (`site_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `project_has_site` (
  `project_has_site_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `project_id` int(11) unsigned DEFAULT NULL,
  `site_id` int(11) unsigned DEFAULT NULL,
  PRIMARY KEY (`project_has_site_id`),
  KEY `fk-project_has_site-site` (`site_id`),
  KEY `fk-project_has_site-project` (`project_id`),
  CONSTRAINT `fk-project_has_site-project` FOREIGN KEY (`project_id`) REFERENCES `project` (`project_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk-project_has_site-site` FOREIGN KEY (`site_id`) REFERENCES `site` (`site_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 

В таблице financial порядка 45к записей.

Есть запрос:


SELECT
    date_format(created, '%Y-%m')                                         month,
    `p`.`project_id`,
    sum(t.chargeback_count) / sum(t.initial_count + t.recurring_count) AS rate
FROM `financial` `t`, `project_has_site` `p`
WHERE (p.site_id = t.site_id) AND (created >= '2017-07-10' AND created <= '2018-01-10')
GROUP BY `p`.`project_id`, `month`;
 


Запрос выполняется порядка 400мс, что считаю достаточно много для такого запроса, индекс для created не цепляется - но при принудительном использовании время не уменьшается, уменьшается только количество строк которое проходит mysql при выборке. Подскажите пожалуйста куда копать и что смотреть?

Версия MySQL: 10.1.20-MariaDB

Отредактированно owner.coder (10.01.2018 18:34:53)

Неактивен

 

#2 10.01.2018 19:30:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Время выполнения запроса

KEY `created_site_id` (`created`,`site_id`),
замените на
    (`site_id`,`created`),

Неактивен

 

#3 11.01.2018 00:15:41

owner.coder
Участник
Зарегистрирован: 10.01.2018
Сообщений: 2

Re: Время выполнения запроса

vasya написал:

KEY `created_site_id` (`created`,`site_id`),
замените на
    (`site_id`,`created`),

Прироста производительности не дало, explain показывает что начал использовать этот ключ но время запроса все равно большое
https://preview.ibb.co/nAjHbm/2018_01_11_0_14_13.png
upload image

Отредактированно owner.coder (11.01.2018 00:16:56)

Неактивен

 

#4 11.01.2018 12:45:28

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Время выполнения запроса

а при старом ключе (`created`,`site_id`) как выглядел explain ?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson