繁体   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