MySQL — оптимизация времени выполнения запросов

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

Я попытался добавить индексы и представления в запрос, но они не улучшают производительность. Может ли кто-нибудь дать предложения? Спасибо.


Связь:

conn = mysql.connect(host = 'relational.fit.cvut.cz', port = int(3306), user = 'guest', passwd = 'relational', db = 'tpch')

Запрос:

WITH customer_lifetime_value AS (
  SELECT
    c_custkey,
    c_name,
    c_address,
    c_nationkey,
    c_phone,
    c_acctbal,
    c_mktsegment,
    c_comment,
    SUM(o_totalprice) AS ltv
  FROM customer
  JOIN orders
    ON o_custkey = c_custkey
  GROUP BY 1, 2, 3, 4, 5, 6, 7, 8
)

SELECT
  r_name,
  MAX(ltv) AS best_customer_value
FROM region
JOIN nation
  ON n_regionkey = r_regionkey
JOIN customer_lifetime_value clv
  ON clv.c_nationkey = n_nationkey
GROUP BY 1;

🤔 А знаете ли вы, что...
Синтаксис SQL (Structured Query Language) используется для взаимодействия с MySQL.


1
53
1

Ответ:

Решено

Не могли бы вы попробовать это? Он должен считывать меньше данных и давать тот же результат:

WITH customer_lifetime_value AS 
(
    SELECT o_custkey
          ,SUM(o_totalprice) AS ltv
    FROM orders 
    GROUP BY o_custkey
)
SELECT
  r_name,
  MAX(ltv) AS best_customer_value
FROM customer_lifetime_value
JOIN customer
    ON o_custkey = c_custkey
JOIN nation
    ON c_nationkey = n_nationkey
JOIN region
    ON n_regionkey = r_regionkey
GROUP BY r_name

Если это правильно, вы можете создать простые индексы:

  • в таблице заказов, включая только o_custkey и o_totalprice
  • в таблице клиентов, включая только c_custkey и c_nationkey