Size: a a a

2020 November 11

IZ

Ilia Zviagin in MySQL
Ruslan Asanov
Всем привет! Подскажите, можно ли оптимизировать данный запрос ? Он выполняется около 30сек на таблице с 5млн записей. Индексы проставил, но они не применяются во время запроса.
Пришли запрос текстом, приложи  DDL таблиц
источник

E

Evgeniy in MySQL
Там тоже должны в названи таблицы быть цифры
источник

IZ

Ilia Zviagin in MySQL
Ruslan Asanov
Всем привет! Подскажите, можно ли оптимизировать данный запрос ? Он выполняется около 30сек на таблице с 5млн записей. Индексы проставил, но они не применяются во время запроса.
Вот нахера слать картинки?
Даже на десктопе не видно ничего!
источник

RA

Ruslan Asanov in MySQL
Ilia Zviagin
Пришли запрос текстом, приложи  DDL таблиц
Запрос
select count(distinct if(Distrib_Currrent = 0, NULL, POS_Id)) as sales,
      count(distinct if(Distrib_LastYear = 0, NULL, POS_Id)) AS last_year,
      KPI_SALES_DATA_MM_Transaction_date
from `_PROC_DASHBOARD_SALES_OVERVIEW_NEW`
where (`KPI_SALES_DATA_MM_Transaction_date` >= 01 and `KPI_SALES_DATA_YYYY_Transaction_date` >= 2020)
 and (`KPI_SALES_DATA_MM_Transaction_date` <= 11 and `KPI_SALES_DATA_YYYY_Transaction_date` <= 2020)
group by `KPI_SALES_DATA_MM_Transaction_date`;


Таблица
CREATE TABLE `_PROC_DASHBOARD_SALES_OVERVIEW_NEW`
(
   `id`                                   int(11) NOT NULL AUTO_INCREMENT,
   `ROUTE_Id`                             int(11)    DEFAULT NULL,
   `POS_Id`                               int(11)    DEFAULT NULL,
   `KPI_SALES_DATA_YYYY_Transaction_date` int(11)    DEFAULT NULL,
   `KPI_SALES_DATA_MM_Transaction_date`   int(11)    DEFAULT NULL,
   `Distrib_Currrent`                     tinyint(1) DEFAULT NULL,
   `Distrib_LastYear`                     tinyint(1) DEFAULT NULL,
   PRIMARY KEY (`id`),
   KEY `ROUTE_Id` (`ROUTE_Id`),
   KEY `POS_Id` (`POS_Id`),
   KEY `KPI_SALES_DATA_YYYY_Transaction_date` (`KPI_SALES_DATA_YYYY_Transaction_date`),
   KEY `KPI_SALES_DATA_MM_Transaction_date` (`KPI_SALES_DATA_MM_Transaction_date`),
   KEY `DATA_YYYY_DATA_MM` (`KPI_SALES_DATA_YYYY_Transaction_date`, `KPI_SALES_DATA_MM_Transaction_date`),
   KEY `Distrib_Currrent` (`Distrib_Currrent`),
   KEY `Distrib_LastYear` (`Distrib_LastYear`),
   KEY `MM_YYYY_POS_Id` (`KPI_SALES_DATA_MM_Transaction_date`, `KPI_SALES_DATA_YYYY_Transaction_date`, `POS_Id`),
) ENGINE = MyISAM
 AUTO_INCREMENT = 5772110
 DEFAULT CHARSET = latin1;
источник

S

Syntax Highlight Bot in MySQL
Ruslan Asanov
Запрос
select count(distinct if(Distrib_Currrent = 0, NULL, POS_Id)) as sales,
      count(distinct if(Distrib_LastYear = 0, NULL, POS_Id)) AS last_year,
      KPI_SALES_DATA_MM_Transaction_date
from `_PROC_DASHBOARD_SALES_OVERVIEW_NEW`
where (`KPI_SALES_DATA_MM_Transaction_date` >= 01 and `KPI_SALES_DATA_YYYY_Transaction_date` >= 2020)
 and (`KPI_SALES_DATA_MM_Transaction_date` <= 11 and `KPI_SALES_DATA_YYYY_Transaction_date` <= 2020)
group by `KPI_SALES_DATA_MM_Transaction_date`;


Таблица
CREATE TABLE `_PROC_DASHBOARD_SALES_OVERVIEW_NEW`
(
   `id`                                   int(11) NOT NULL AUTO_INCREMENT,
   `ROUTE_Id`                             int(11)    DEFAULT NULL,
   `POS_Id`                               int(11)    DEFAULT NULL,
   `KPI_SALES_DATA_YYYY_Transaction_date` int(11)    DEFAULT NULL,
   `KPI_SALES_DATA_MM_Transaction_date`   int(11)    DEFAULT NULL,
   `Distrib_Currrent`                     tinyint(1) DEFAULT NULL,
   `Distrib_LastYear`                     tinyint(1) DEFAULT NULL,
   PRIMARY KEY (`id`),
   KEY `ROUTE_Id` (`ROUTE_Id`),
   KEY `POS_Id` (`POS_Id`),
   KEY `KPI_SALES_DATA_YYYY_Transaction_date` (`KPI_SALES_DATA_YYYY_Transaction_date`),
   KEY `KPI_SALES_DATA_MM_Transaction_date` (`KPI_SALES_DATA_MM_Transaction_date`),
   KEY `DATA_YYYY_DATA_MM` (`KPI_SALES_DATA_YYYY_Transaction_date`, `KPI_SALES_DATA_MM_Transaction_date`),
   KEY `Distrib_Currrent` (`Distrib_Currrent`),
   KEY `Distrib_LastYear` (`Distrib_LastYear`),
   KEY `MM_YYYY_POS_Id` (`KPI_SALES_DATA_MM_Transaction_date`, `KPI_SALES_DATA_YYYY_Transaction_date`, `POS_Id`),
) ENGINE = MyISAM
 AUTO_INCREMENT = 5772110
 DEFAULT CHARSET = latin1;
источник

S

Syntax Highlight Bot in MySQL
Ruslan Asanov
Запрос
select count(distinct if(Distrib_Currrent = 0, NULL, POS_Id)) as sales,
      count(distinct if(Distrib_LastYear = 0, NULL, POS_Id)) AS last_year,
      KPI_SALES_DATA_MM_Transaction_date
from `_PROC_DASHBOARD_SALES_OVERVIEW_NEW`
where (`KPI_SALES_DATA_MM_Transaction_date` >= 01 and `KPI_SALES_DATA_YYYY_Transaction_date` >= 2020)
 and (`KPI_SALES_DATA_MM_Transaction_date` <= 11 and `KPI_SALES_DATA_YYYY_Transaction_date` <= 2020)
group by `KPI_SALES_DATA_MM_Transaction_date`;


Таблица
CREATE TABLE `_PROC_DASHBOARD_SALES_OVERVIEW_NEW`
(
   `id`                                   int(11) NOT NULL AUTO_INCREMENT,
   `ROUTE_Id`                             int(11)    DEFAULT NULL,
   `POS_Id`                               int(11)    DEFAULT NULL,
   `KPI_SALES_DATA_YYYY_Transaction_date` int(11)    DEFAULT NULL,
   `KPI_SALES_DATA_MM_Transaction_date`   int(11)    DEFAULT NULL,
   `Distrib_Currrent`                     tinyint(1) DEFAULT NULL,
   `Distrib_LastYear`                     tinyint(1) DEFAULT NULL,
   PRIMARY KEY (`id`),
   KEY `ROUTE_Id` (`ROUTE_Id`),
   KEY `POS_Id` (`POS_Id`),
   KEY `KPI_SALES_DATA_YYYY_Transaction_date` (`KPI_SALES_DATA_YYYY_Transaction_date`),
   KEY `KPI_SALES_DATA_MM_Transaction_date` (`KPI_SALES_DATA_MM_Transaction_date`),
   KEY `DATA_YYYY_DATA_MM` (`KPI_SALES_DATA_YYYY_Transaction_date`, `KPI_SALES_DATA_MM_Transaction_date`),
   KEY `Distrib_Currrent` (`Distrib_Currrent`),
   KEY `Distrib_LastYear` (`Distrib_LastYear`),
   KEY `MM_YYYY_POS_Id` (`KPI_SALES_DATA_MM_Transaction_date`, `KPI_SALES_DATA_YYYY_Transaction_date`, `POS_Id`),
) ENGINE = MyISAM
 AUTO_INCREMENT = 5772110
 DEFAULT CHARSET = latin1;
источник

S

Syntax Highlight Bot in MySQL
====================================================
источник

RA

Ruslan Asanov in MySQL
Ilia Zviagin
Вот нахера слать картинки?
Даже на десктопе не видно ничего!
сорри, я не специально :) Думал что всё хорошо будет видно
источник

IZ

Ilia Zviagin in MySQL
Ruslan Asanov
Запрос
select count(distinct if(Distrib_Currrent = 0, NULL, POS_Id)) as sales,
      count(distinct if(Distrib_LastYear = 0, NULL, POS_Id)) AS last_year,
      KPI_SALES_DATA_MM_Transaction_date
from `_PROC_DASHBOARD_SALES_OVERVIEW_NEW`
where (`KPI_SALES_DATA_MM_Transaction_date` >= 01 and `KPI_SALES_DATA_YYYY_Transaction_date` >= 2020)
 and (`KPI_SALES_DATA_MM_Transaction_date` <= 11 and `KPI_SALES_DATA_YYYY_Transaction_date` <= 2020)
group by `KPI_SALES_DATA_MM_Transaction_date`;


Таблица
CREATE TABLE `_PROC_DASHBOARD_SALES_OVERVIEW_NEW`
(
   `id`                                   int(11) NOT NULL AUTO_INCREMENT,
   `ROUTE_Id`                             int(11)    DEFAULT NULL,
   `POS_Id`                               int(11)    DEFAULT NULL,
   `KPI_SALES_DATA_YYYY_Transaction_date` int(11)    DEFAULT NULL,
   `KPI_SALES_DATA_MM_Transaction_date`   int(11)    DEFAULT NULL,
   `Distrib_Currrent`                     tinyint(1) DEFAULT NULL,
   `Distrib_LastYear`                     tinyint(1) DEFAULT NULL,
   PRIMARY KEY (`id`),
   KEY `ROUTE_Id` (`ROUTE_Id`),
   KEY `POS_Id` (`POS_Id`),
   KEY `KPI_SALES_DATA_YYYY_Transaction_date` (`KPI_SALES_DATA_YYYY_Transaction_date`),
   KEY `KPI_SALES_DATA_MM_Transaction_date` (`KPI_SALES_DATA_MM_Transaction_date`),
   KEY `DATA_YYYY_DATA_MM` (`KPI_SALES_DATA_YYYY_Transaction_date`, `KPI_SALES_DATA_MM_Transaction_date`),
   KEY `Distrib_Currrent` (`Distrib_Currrent`),
   KEY `Distrib_LastYear` (`Distrib_LastYear`),
   KEY `MM_YYYY_POS_Id` (`KPI_SALES_DATA_MM_Transaction_date`, `KPI_SALES_DATA_YYYY_Transaction_date`, `POS_Id`),
) ENGINE = MyISAM
 AUTO_INCREMENT = 5772110
 DEFAULT CHARSET = latin1;
Сколько записей всего в таблице , и сколько подходит под это условие?

KPI_SALES_DATA_MM_Transaction_date >= 01 and KPI_SALES_DATA_YYYY_Transaction_date >= 2020)
 and (KPI_SALES_DATA_MM_Transaction_date <= 11 and KPI_SALES_DATA_YYYY_Transaction_date <= 2020)
источник

IZ

Ilia Zviagin in MySQL
Ruslan Asanov
сорри, я не специально :) Думал что всё хорошо будет видно
А подумай, если бы надо было что-то подправить и тебе прислать в ответ - КАК?
источник

RA

Ruslan Asanov in MySQL
Записей 5.7млн и почти все они подходят
источник

RA

Ruslan Asanov in MySQL
Explain запроса такой
источник

IZ

Ilia Zviagin in MySQL
Ruslan Asanov
Записей 5.7млн и почти все они подходят
Тады всё, оптимизировать некуда.
источник

IZ

Ilia Zviagin in MySQL
Ruslan Asanov
Записей 5.7млн и почти все они подходят
Там ещё и по разным месяцам?
Нуну...
источник

RA

Ruslan Asanov in MySQL
Да ( так необходимо для вывода графиков
источник

RA

Ruslan Asanov in MySQL
Ilia Zviagin
Тады всё, оптимизировать некуда.
А это нормально что не используются индексы ?
источник

IZ

Ilia Zviagin in MySQL
Ruslan Asanov
А это нормально что не используются индексы ?
да, и даже хорошо
источник

IZ

Ilia Zviagin in MySQL
Ruslan Asanov
Запрос
select count(distinct if(Distrib_Currrent = 0, NULL, POS_Id)) as sales,
      count(distinct if(Distrib_LastYear = 0, NULL, POS_Id)) AS last_year,
      KPI_SALES_DATA_MM_Transaction_date
from `_PROC_DASHBOARD_SALES_OVERVIEW_NEW`
where (`KPI_SALES_DATA_MM_Transaction_date` >= 01 and `KPI_SALES_DATA_YYYY_Transaction_date` >= 2020)
 and (`KPI_SALES_DATA_MM_Transaction_date` <= 11 and `KPI_SALES_DATA_YYYY_Transaction_date` <= 2020)
group by `KPI_SALES_DATA_MM_Transaction_date`;


Таблица
CREATE TABLE `_PROC_DASHBOARD_SALES_OVERVIEW_NEW`
(
   `id`                                   int(11) NOT NULL AUTO_INCREMENT,
   `ROUTE_Id`                             int(11)    DEFAULT NULL,
   `POS_Id`                               int(11)    DEFAULT NULL,
   `KPI_SALES_DATA_YYYY_Transaction_date` int(11)    DEFAULT NULL,
   `KPI_SALES_DATA_MM_Transaction_date`   int(11)    DEFAULT NULL,
   `Distrib_Currrent`                     tinyint(1) DEFAULT NULL,
   `Distrib_LastYear`                     tinyint(1) DEFAULT NULL,
   PRIMARY KEY (`id`),
   KEY `ROUTE_Id` (`ROUTE_Id`),
   KEY `POS_Id` (`POS_Id`),
   KEY `KPI_SALES_DATA_YYYY_Transaction_date` (`KPI_SALES_DATA_YYYY_Transaction_date`),
   KEY `KPI_SALES_DATA_MM_Transaction_date` (`KPI_SALES_DATA_MM_Transaction_date`),
   KEY `DATA_YYYY_DATA_MM` (`KPI_SALES_DATA_YYYY_Transaction_date`, `KPI_SALES_DATA_MM_Transaction_date`),
   KEY `Distrib_Currrent` (`Distrib_Currrent`),
   KEY `Distrib_LastYear` (`Distrib_LastYear`),
   KEY `MM_YYYY_POS_Id` (`KPI_SALES_DATA_MM_Transaction_date`, `KPI_SALES_DATA_YYYY_Transaction_date`, `POS_Id`),
) ENGINE = MyISAM
 AUTO_INCREMENT = 5772110
 DEFAULT CHARSET = latin1;
Ой, мать мать мать....

Слона-то я не заметил!

ENGINE = MyISAM — меняй. На Inno.

Хотя , запросу это может и не поможет.

Но хотя бы кэш использоваться будет.
источник

IZ

Ilia Zviagin in MySQL
Ruslan Asanov
Запрос
select count(distinct if(Distrib_Currrent = 0, NULL, POS_Id)) as sales,
      count(distinct if(Distrib_LastYear = 0, NULL, POS_Id)) AS last_year,
      KPI_SALES_DATA_MM_Transaction_date
from `_PROC_DASHBOARD_SALES_OVERVIEW_NEW`
where (`KPI_SALES_DATA_MM_Transaction_date` >= 01 and `KPI_SALES_DATA_YYYY_Transaction_date` >= 2020)
 and (`KPI_SALES_DATA_MM_Transaction_date` <= 11 and `KPI_SALES_DATA_YYYY_Transaction_date` <= 2020)
group by `KPI_SALES_DATA_MM_Transaction_date`;


Таблица
CREATE TABLE `_PROC_DASHBOARD_SALES_OVERVIEW_NEW`
(
   `id`                                   int(11) NOT NULL AUTO_INCREMENT,
   `ROUTE_Id`                             int(11)    DEFAULT NULL,
   `POS_Id`                               int(11)    DEFAULT NULL,
   `KPI_SALES_DATA_YYYY_Transaction_date` int(11)    DEFAULT NULL,
   `KPI_SALES_DATA_MM_Transaction_date`   int(11)    DEFAULT NULL,
   `Distrib_Currrent`                     tinyint(1) DEFAULT NULL,
   `Distrib_LastYear`                     tinyint(1) DEFAULT NULL,
   PRIMARY KEY (`id`),
   KEY `ROUTE_Id` (`ROUTE_Id`),
   KEY `POS_Id` (`POS_Id`),
   KEY `KPI_SALES_DATA_YYYY_Transaction_date` (`KPI_SALES_DATA_YYYY_Transaction_date`),
   KEY `KPI_SALES_DATA_MM_Transaction_date` (`KPI_SALES_DATA_MM_Transaction_date`),
   KEY `DATA_YYYY_DATA_MM` (`KPI_SALES_DATA_YYYY_Transaction_date`, `KPI_SALES_DATA_MM_Transaction_date`),
   KEY `Distrib_Currrent` (`Distrib_Currrent`),
   KEY `Distrib_LastYear` (`Distrib_LastYear`),
   KEY `MM_YYYY_POS_Id` (`KPI_SALES_DATA_MM_Transaction_date`, `KPI_SALES_DATA_YYYY_Transaction_date`, `POS_Id`),
) ENGINE = MyISAM
 AUTO_INCREMENT = 5772110
 DEFAULT CHARSET = latin1;
Ещё ты можешь попробовать (!!!)
сделать этот индекс кластерным —
KEY DATA_YYYY_DATA_MM (KPI_SALES_DATA_YYYY_Transaction_date, KPI_SALES_DATA_MM_Transaction_date),

(но это ТОЛЬКО НА INNODB ! иначе бесполезно)

Может быть это избавить запрос от file sort, что конечно очень хреново в данном случае (5 млн).

В GROUP BY надо тогда будет добавить оба эти поля (одно добавить, одно уже есть)
источник

RA

Ruslan Asanov in MySQL
А разве MyISAM не быстрее на чтение ? В эту таблицу данные редко записываются, а если записываются, то сразу по несколько млн
источник