Как свести к минимуму SQL-запрос, чтобы вывод очень быстро? - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть два запроса, из которых я создал один, который дает мне полные данные, но проблема в том, что выполнение занимает так много времени.

Я использую несколько случаев из-за этогоэто занимает так много времени, я просто хочу знать, могу ли я свести его к минимуму, чтобы он не влиял на мой вывод, а выполнялся быстрее.

Query1

select outlet, sum(netamount) 
from syncbill 
where cancelled<>'Y' 
and year(curdate())=year(billdate) 
and month(curdate())=month(billdate) 
group by OUTLET;

Query2

select outlet,sum(netamount) 
from syncbill 
where cancelled<>'Y' 
and year(curdate())=year(billdate) 
group by OUTLET;

Я объединяю два вышеупомянутых запроса, чтобы получить результат за один раз

новый запрос

select  b.CUSTOMERDESCRIPTOR as outlet,
        round(sum(case when year(curdate())=year(a.billdate) and month(curdate())=month(a.billdate) then a.netamount else 0 end)) as monthAmount, 
        ROUND(SUM(CASE WHEN YEAR(CURDATE() + INTERVAL 9 MONTH) = YEAR(billdate + INTERVAL 9 MONTH) THEN netamount ELSE 0 END)) as yearAmount , 
        round(Sum(case when a.billdate >= date(now()) then a.netamount else 0 end)) as Transaction
from syncbill a Inner Join
     ecustomer b
     on a.outlet = b.CUSTOMERIDENTIFIER 
where a.cancelled <> 'Y' and
      outlet in (select CUSTOMERIDENTIFIER from mt_distributrol where mt_distributr_vcdistributrcode = 'AAAA')
group by a.OUTLET

В этом запросе я делаю

Расчет данных текущего месяца и данных текущего года (финансового года), если есть данные, а затем данные 0.

Но этозанимает так много времени, что кажется очень плохим пользовательским опытом.Как я могу минимизировать это?

Редактировать

Я сделал новый запрос после создания индексов, но запрос показывает ошибку.Вот мой запрос:

select outlet,round(sum(case when year(curdate())=year(billdate) and month(curdate())=month(billdate) then netamount else 0 end)) as monthAmount, ROUND(SUM(CASE WHEN YEAR(CURDATE() + INTERVAL 9 MONTH) = YEAR(billdate + INTERVAL 9 MONTH) THEN netamount ELSE 0 END)) as yearAmount , round(Sum(case when billdate >= date(now()) then netamount else 0 end)) as Transaction from syncbill where cancelled<>'Y' and force index (ix_cancelled, ix_outlet) and force INDEX (ix_outlet) FOR group by OUTLET

Это ошибка, которую я получаю

запрос с силой

select  b.CUSTOMERDESCRIPTOR as outlet,round(sum(case when year(curdate())=year(a.billdate) and month(curdate())=month(a.billdate) then a.netamount else 0 end)) as monthAmount, ROUND(SUM(CASE WHEN YEAR(CURDATE() + INTERVAL 9 MONTH) = YEAR(billdate + INTERVAL 9 MONTH) THEN netamount ELSE 0 END)) as yearAmount , round(Sum(case when a.billdate >= date(now()) then a.netamount else 0 end)) as Transaction from  syncbill a force index (ix_cancelled_OUTLET_billdate) Inner Join ecustomer b on a.outlet = b.CUSTOMERIDENTIFIER where    a.cancelled<>'Y' and  outlet in(select CUSTOMERIDENTIFIER from mt_distributrol where mt_distributr_vcdistributrcode = 'AAAA')  group by   a.OUTLET

error I am getting from new query after creating indexes

final query result

after running the query with explain

table structure in database

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Для повышения производительности new_Query у вас должен быть один индекс на три столбца (отменено, OUTLET) с этим порядком, который я пишу;потому что при выполнении запроса сначала выполняется выражение, затем группируется выражение, а в конце - оператор выбора;если страницы данных индекса были созданы со столбцами, которые используются в этом порядке, скорость поиска данных увеличивается.

CREATE  INDEX ix_cancelled_OUTLET ON syncbill(cancelled, OUTLET);
0 голосов
/ 11 февраля 2019

Я предлагаю вам создать пару индексов: один для «выхода» для группы и один для отмены для улучшения фильтра.

CREATE  INDEX ix_outlet ON syncbill(outlet);

и

CREATE  INDEX ix_cancelled ON syncbill(cancelled);

затем заставьте mysql использовать эти

select a,b,c
from my_table
force index (ix_cancelled, ix_outlet)
force INDEX (ix_outlet) FOR GROUP BY
where a = condition_1
group by a,b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...