我有一個查詢來顯示客戶和他們所有訂單的總美元價值。該查詢大約需要100秒才能執行。在同一張表上加入的慢速聚合查詢
我在ExpressionEngine CMS數據庫上查詢。對於所有內容,ExpressionEngine使用一個表exp_channel_data
。因此,我必須加入客戶和訂單數據。在這張表中,我有大約14,000個客戶,30,000個訂單和160,000個總記錄。
我可以更改此查詢來加速嗎?
SELECT link.author_id AS customer_id,
customers.field_id_122 AS company,
Sum(orders.field_id_22) AS total_orders
FROM exp_channel_data customers
JOIN exp_channel_titles link
ON link.author_id = customers.field_id_117
AND customers.channel_id = 7
JOIN exp_channel_data orders
ON orders.entry_id = link.entry_id
AND orders.channel_id = 3
GROUP BY customer_id
謝謝,請讓我知道如果我應該包括其他信息。
Update解決方案
我的道歉。我注意到entry_id
爲exp_channel_data
表客戶對應author_id
爲exp_channel_titles
表。所以我不必在連接中使用field_id_117
。 field_id_117
重複entry_id
,但在TEXT字段中。在文本領域加入進程會減慢速度。查詢現在是3秒
但是,@DRapp發佈的內部聯接解決方案是1.5秒。這裏是他的SQL與輕微編輯:
SELECT
PQ.author_id CustomerID,
c.field_id_122 CompanyName,
PQ.totalOrders
FROM
(SELECT
t.author_id
SUM(o.field_id_22) as totalOrders
FROM
exp_channel_data o
JOIN
exp_channel_titles t ON t.author_id = o.entry_id AND o.channel_id = 3
GROUP BY
t.author_id) PQ
JOIN
exp_channel_data c ON PQ.author_id = c.entry_id AND c.channel_id = 7
ORDER BY CustomerID
您可以發佈一個EXPLAIN查詢的結果包裹?我猜測你的表格在這個操作中沒有很好的索引。您加入的所有列都應該被編入索引。作爲第一個猜測,我會看看索引exp_channel_data.field_id_117。 – AllInOne
你是對的,'exp_channel_data。field_id_117'沒有索引。它實際上是一個TEXT字段,除了該表中的關鍵字段以外的所有字段。所以我把它改成了varchar,所以我可以添加一個索引,這對我有很大的幫助。原來我並不需要'field_id_117',雖然在我的更新中。謝謝! –