簡體   English   中英

如何加快在具有 1000 萬條記錄的表中運行的查詢

[英]How to speed up a query which runs in a table with 10 million records

我正在使用以下查詢從 SQL 數據庫中的表中檢索記錄。 此報告匯總條目列表的值總和。 最終結果是一份報告,列出了來自大約 700 萬條記錄的大約 2500 名客戶。

select customer_id, sum(value) as value 
from `data` 
where ((`date` >= '2020-05-11' and `date` <= '2020-06-9')) 
group by `customer_id` 
order by `value` desc, `customer_id` asc;

如果我選擇全年作為日期范圍,則生成此報告大約需要 60 秒。 此報告還具有可自定義的 function,它允許用戶在報告中添加多達 3 個特定列。 所以除了簡單的listing,用戶可以選擇查看銷售來自哪些媒體、產品類別和產品部門。

我想加快生成報告所需的處理時間,並考慮創建一個額外的表,該表將簡單地保存分組條目,其中包含每個客戶的當前聚合值以及上一段中提到的 3 個字段的信息。 這基本上意味着我的數據庫將從大約 700 萬條記錄縮減到大約 250 萬條記錄。 此外,表格中已經計算了總和,這樣也可以節省時間。

(我假設)你認為這張額外的桌子會有所作為嗎? 還有其他建議嗎?

在一些評論后添加。 至少可以說有趣的評論。 為了讓事情更具挑戰性,讓我添加更多細節。 我在兩台不同的服務器上運行相同的數據庫內容。 原始數據庫僅包含一個包含 700 萬條記錄的主表,根本沒有索引。 所以所有的搜索都是基於文本的。 大多數查詢仍然以可接受的速度運行。 第二個數據庫來自原始數據庫中的主表。 該數據庫被拆分為較小的表,具有適當的索引,並且該數據庫上的查詢比原始數據庫中的查詢花費的時間要長一些。 (當然同樣的查詢)。 然而,我的主要問題仍然是這個。 如果我創建一個僅列出客戶匯總金額的新表,以及第一段中提到的 3 個字段的信息,那會有所不同。 讓我用一個實際的例子來說明這一點。 一位客戶購買了屬於兩個不同產品類別的 15 種不同產品。 我的銷售表將為此事務的原始銷售表添加 15 條記錄。 我的新銷售表只會按類別列出購買的總和,因此它只會添加 2 條記錄。在大規模上,這意味着我將能夠將 7 百萬條記錄(並且還在增長)縮小到 2 百萬條記錄表. 所以我的問題是。 你認為這會加快我的查詢速度嗎?

您可以使用覆蓋索引加快查詢速度:

create index ix1 on data (date, customer_id, value);

該索引將提高查詢的性能,假設它返回的行數有限; 結果集不超過行的 0.5%。 但是,您的查詢似乎正在處理整整一個月的數據。 不管你怎么做,這肯定會很慢。

至少,確保在 [日期] 有一個索引。

確保您正在比較相同的數據類型 - 否則可能不會使用索引。 在您的原始代碼中,您將 [date] 列與字符串進行比較。

如果 [date] 是一個日期,那么你應該這樣做:

([date] >= convert( date, '2020-05-11') and [date] <= convert(date,'2020-06-9'))

如果 [date] 是一個字符串,那么您應該使用'2020-06-09'而不是'2020-06-9'來修復您的第二個日期,因為原始日期將返回 6 月的所有日期。 還要確保它真的總是 YYYY-MM-DD 而不是任何其他格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM