首页 > 解决方案 > 如何加快sql查询

问题描述

我有一张表格,列出了品牌的广告行为。每个动作都由一个条目记录,如您可以在下面的驱动器文件夹中看到的 excel 文件中所示。表中有大约 700 万条记录。我正在运行几个运行良好的查询,但我面临一个特定报告的问题。此报告按广告支出总额列出客户(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 个月到 2 年,则生成此报告大约需要一分钟。如果我的日期范围选择为 1 个月或更短,则只需不到 3 秒。

我需要让这个查询在最多 10-15 秒内处理。我们试图想出一些想法,例如在数据库中创建一个新表,特别是针对这个查询,但是当我们看到我们仍然必须保留所有日期记录时,它碰壁了,因此我们不能对表中的结果进行分组。

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

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

驱动器文件夹

标签: sqlperformance

解决方案


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

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

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


推荐阅读