Оптимизировать запрос Mysql

avatar
Peter
9 августа 2021 в 01:11
55
2
1

Я хотел бы оптимизировать следующий запрос:

SELECT
                      a.id, a.pay_point_name, a.pay_point_location,
                      COUNT(b.id) AS countedCustomers,
                      SUM(b.approved) AS summedLoans,
                      SUM(c.deduction) AS summedDeductions 
                  FROM
                      pay_tbl a 
                  LEFT JOIN
                      customer_tbl b 
                          ON b.employer = a.pay_point_name 
                  LEFT JOIN
                      loans_tbl c 
                          ON c.paypoint = a.pay_point_name 
                  GROUP BY
                      a.pay_point_name 
                  ORDER BY
                      NULL

Текущее время выполнения: 161,2 с

Оператор

EXPLAIN дает мне следующую таблицу: EXPLAIN statement gives me this table

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

Источник
Rahul Biswas
9 августа 2021 в 05:33
0

Привет @Peter, есть ли какая-нибудь логика для использования NULL в предложении ORDER BY?

Rahul Biswas
9 августа 2021 в 06:26
1

Привет @Peter. Условие соединения со строкой замедляет выполнение запроса, поскольку строка содержит строчные, прописные или пустые пробелы в начале или конце строки. Для лучшего поиска лучше использовать целочисленное поле. Индекс также эффективен для целочисленного типа данных вместо строкового типа данных.

Peter
9 августа 2021 в 09:13
0

@RahulBiswas Не обязательно, я мог бы убрать ORDER BY NULL, но это не имеет никакого значения, есть ли у вас дополнительные рекомендации?

Ответы (2)

avatar
Rahul Biswas
9 августа 2021 в 09:27
1

Пожалуйста, проверьте это, где я использовал подзапрос. Если это работает, лучше создайте представление с этим запросом.

-- MySQL
SELECT t.id, t.pay_point_name
     , t.pay_point_location
     , COALESCE(t.countedCustomers, 0) countedCustomers
     , COALESCE(t.summedLoans, 0) summedLoans
     , COALESCE(p.summedDeductions, 0) summedDeductions
FROM (SELECT a.id, a.pay_point_name
           , MAX(a.pay_point_location) pay_point_location
           , COUNT(b.id) AS countedCustomers
           , SUM(b.approved) AS summedLoans
      FROM pay_tbl a 
      LEFT JOIN customer_tbl b 
             ON b.employer = a.pay_point_name
      GROUP BY a.id, a.pay_point_name) t
LEFT JOIN (SELECT paypoint
                , SUM(deduction) AS summedDeductions
           FROM loans_tbl
           GROUP BY paypoint) p
       ON t.pay_point_name = p.paypoint
ORDER BY t.id;
Rahul Biswas
9 августа 2021 в 09:28
1

Привет @Peter, пожалуйста, проверьте этот запрос и дайте мне знать, если у вас есть какие-либо вопросы по этому поводу.

Rahul Biswas
9 августа 2021 в 09:35
1

Привет, @Peter, ты работаешь со всеми данными этих трех таблиц? Потому что здесь не используются критерии поиска. Это будет медленнее, когда таблицы содержат огромные данные. Используйте идентификатор вместо имени в условии JOIN.

Rahul Biswas
9 августа 2021 в 11:12
1

@Peter любые отзывы о моем запросе.

Peter
10 августа 2021 в 09:40
0

к счастью, ваш запрос работает нормально, но вы пропустили эту его часть: SUM(b.approved) AS summedLoans,. Можете ли вы обновить, пожалуйста? Большое спасибо.

Rahul Biswas
10 августа 2021 в 09:53
1

Привет, @Peter, пожалуйста, проверь сейчас. Извините, я забыл выбрать этот столбец. Теперь я добавил это.

Peter
10 августа 2021 в 09:56
0

Большое спасибо, Рахул Бисвас, не могли бы вы помочь оптимизировать больше запросов?

Peter
10 августа 2021 в 09:57
1

Простите, я забыл сказать, что после использования вашего запроса время выполнения теперь составляет 0,0898 секунды.

Rahul Biswas
10 августа 2021 в 09:58
0

Добро пожаловать @Peter. Я постараюсь изо всех сил помочь вам в оптимизации запроса.

Peter
10 августа 2021 в 10:04
1

проголосуйте за этот вопрос, чтобы другие разработчики могли легко его найти, спасибо

avatar
vinieth
9 августа 2021 в 06:08
0

Предположим, что вам нужно многократно выполнять один и тот же запрос. Вы можете использовать представления MySql.

https://www.mysqltutorial.org/mysql-views-tutorial.aspx