Sql 如何加快在具有1000万条记录的表中运行的查询

Sql 如何加快在具有1000万条记录的表中运行的查询,sql,performance,Sql,Performance,我使用下面的查询从SQL数据库中的表中检索记录。此报表汇总条目列表的值之和。最终的结果是一份报告列出了大约7百万条记录中的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`

我使用下面的查询从SQL数据库中的表中检索记录。此报表汇总条目列表的值之和。最终的结果是一份报告列出了大约7百万条记录中的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;
选择客户id,总和(值)作为值
来自“数据”

其中(`date`>='2020-05-11'和`date`您可以使用覆盖索引加快查询速度:


假设此索引返回的行数有限;结果集不超过行数的0.5%,则此索引将提高查询的性能。但是,您的查询似乎处理了整整一个月的数据。无论您如何操作,这肯定会很慢。

您可以使用覆盖索引加快查询速度:


假设此索引返回的行数有限;结果集不超过行数的0.5%,则此索引将提高查询的性能。但是,您的查询似乎处理了整整一个月的数据。无论您如何操作,这肯定会很慢。

至少要确保在[date]上有索引

确保您正在比较相同的数据类型,否则可能不会使用索引。在原始代码中,您正在将[date]列与字符串进行比较

如果[date]是一个日期,那么您应该执行以下操作:


([date]>=convert(日期,'2020-05-11')和[date]至少要确保[date]上有索引

确保您正在比较相同的数据类型,否则可能不会使用索引。在原始代码中,您正在将[date]列与字符串进行比较

如果[date]是一个日期,那么您应该执行以下操作:


([date]>=转换(日期,'2020-05-11')和[date]你试过在“日期”列添加索引吗?你使用的是哪种dbms?我不知道你的数据大小。你的第一段建议2500个客户每月有500万行。后来你提到整个数据库有700万行。这种汇总会产生250万条记录。我只是迷路了。这是多久一次ery(/querys)即使是运行。每天一次,一分钟也不会太痛苦。是的,如果你将数据汇总到一个新表中,它的速度会更快,因为它的行数更少,所有事情都是相同的。你是否尝试过在“日期”列中添加索引?你使用的是哪种dbms?我不知道你的数据大小。你的第一段建议你每天有500万行一个月2500个客户。之后你提到整个数据库有700万行。这个汇总将产生250万条记录。我只是迷路了。这个查询(/querys)的频率是多少即使运行。每天一次,一分钟也不会太痛苦。是的,如果你将数据汇总到一个新表中,它的速度会更快,因为它的行数更少,所有事情都是相等的。没有理由认为没有正确的索引,所以建议创建此索引只是“瞎猜”。还要考虑到给定查询是不可能的真实查询的简化(参见
…最多3个特定列的注释…
)通过这种逻辑,我们是否可以说没有理由认为查询速度慢,并对问题进行向下投票?我建议假设最仁慈、最不迂腐的解释。如果是真的,则查询速度慢(如果我们有在类似卷上进行类似工作并在更短时间内完成的查询,则可以证明),那么就有充分的理由认为适当的索引不存在或没有被使用。至少可以说,这是一个有趣的评论。为了让事情变得更具挑战性,让我再补充一些细节。我在两个不同的服务器上运行相同的数据库内容。原始数据库只包含一个主表,其中包含7 mil记录,没有索引ng。所以所有搜索都是基于文本的。但大多数查询的运行速度可以接受。没有理由认为没有正确的索引,因此建议创建此索引只是“瞎猜”。还要考虑到,给定查询是对实际查询的简化(参见
…最多3个特定列的注释…
)按照这种逻辑,我们是否可以说没有理由认为查询速度慢,并对问题进行否决投票?我建议假设最仁慈、最不迂腐的解释。如果是真的,则查询速度慢(如果我们有在类似卷上进行类似工作并在更短时间内完成的查询,则可以证明),那么就有充分的理由认为适当的索引不存在或没有被使用。至少可以说,这是一个有趣的评论。为了让事情变得更具挑战性,让我再补充一些细节。我在两个不同的服务器上运行相同的数据库内容。原始数据库只包含一个主表,其中包含7 mil记录,没有索引ng。所以所有的搜索都是基于文本的。但大多数查询的运行速度还是可以接受的。
create index ix1 on data (date, customer_id, value);