如何加速sql查询

如何加速sql查询,sql,performance,Sql,Performance,我有一张表格,上面列出了各个品牌的广告活动。每个操作都由一个条目记录,如下面驱动器文件夹中的excel文件所示。表中大约有7ml记录。 我正在运行几个运行良好的查询,但我面临一个特定报告的问题。此报告列出了Excel文件中客户的L列,并按广告支出总额对其进行排序。如果设置的日期范围介于两个月到两年之间,则生成此报告大约需要一分钟 下面是查询的副本 select customer_id, sum(value) as value from `data` where ((`date` >=

我有一张表格,上面列出了各个品牌的广告活动。每个操作都由一个条目记录,如下面驱动器文件夹中的excel文件所示。表中大约有7ml记录。 我正在运行几个运行良好的查询,但我面临一个特定报告的问题。此报告列出了Excel文件中客户的L列,并按广告支出总额对其进行排序。如果设置的日期范围介于两个月到两年之间,则生成此报告大约需要一分钟

下面是查询的副本

select customer_id, sum(value) as value 
from `data` 
where ((`date` >= '2019-01-01' and `date` <= '2019-12-31')) 
group by `customer_id` 
order by `value` desc, `customer_id` asc;
如果设置的日期范围介于2个月到两年之间,则生成此报告大约需要一分钟。如果我选择的日期范围为一个月或更短,则所需时间少于3秒

我需要在最长不到10-15秒的时间内处理此查询。我们试图想出一些想法,例如在DB中创建一个新表,特别是针对此查询,但当我们看到仍必须保留所有日期记录时,遇到了困难,因此无法将结果分组到表中

我们真的愿意接受任何可以加快查询速度的想法,包括数据库更改

下面是指向文件夹的链接,其中包含DB结构的副本和从包含所有数据的数据表导出的示例数据集


您应该对查询条件所必需的字段建立索引。在这种情况下,类似于:

CREATE INDEX `idx_data_date` ON `data`(`date`);
CREATE INDEX `idx_data_customer_id` ON `data`(`customer_id`);

您还应该避免将日期存储为文本。如果可以的话,请使用DATETIME。

这项针对700万条记录的查询应该不会花费一分钟的时间,除非您的硬件速度非常慢或记录非常大。它没有说明您正在运行的SQL是什么,但我的MySql数据库也有类似的问题,直到我添加了索引。它最初的配置很差。实际上,我们尝试在几个数据库上运行查询但是结果总是一样的。所以我们得出结论,这不是硬件问题。我不确定你的大单位是什么。您可以在下面的链接中查看示例数据集中的实际记录。是的,所有基本条件都有索引。您正在排序的值字段也有索引?实际上不是值。假设你有4个客户的12条记录,每个客户3条记录,每条记录100欧元,每年不同的日期。查询将返回4个客户的列表,每个客户的总金额为300欧元。在实际表中,列表将按降序返回值。一个想法是创建另一个表来保存实际的查询结果。理论上,这会将记录分组,表格会更小。但是我们需要保留每个记录的日期值。这意味着表的大小只会缩小20%。日期真的存储为字符串吗?将其存储为实际日期时间类型以避免所有字符串处理不是更好吗?