2GB以上可加快单个表上的SQL查询

埃利安

我正在对MYSQL数据库中非常大的表中的广告收入进行查询。它包含许多维度,例如设备类别,日期,广告客户,垂直,creative_size,位置等,以及一些指标,例如投放的展示次数,点击次数和收入。

该表用于显示广告效果,因此通常按一两个维度进行分组并按维度进行过滤。

我将所有内容都放在一张表中,以避免连接并使其尽可能快,但是由于维数特别是。广告客户,这个表很大,已经超过2.8Gb,并且还在增长。

我已经尝试过建立索引和分区,但是它仍然很慢,所以我正在考虑通过将数据按较小的维度集分组来创建较小的版本,而忽略广告客户列,即

Select date, creative_size, device_class,ssp,billing_type, location,
       ad_impressions, clicks, revenue
  from ADS
 group by date,creative_size,device_class,ssp,billing_type,location

这将大大减少行数。

我试图将其用作视图,但是它不会永久存储,因此需要更长的时间。如何创建这样的表并根据其他表保持最新状态?我需要编写脚本还是可以使用一些内置的MySQL功能?那是可行的方法吗?我当然愿意接受其他解决方案:)

琼斯

您是正确的,MySQL的VIEW对象无助于查询性能。用行业术语来说,它们不是“物化视图”。

您尚未向我们透露您使用的实际查询或大表的实际布局。因此,具体建议实际上是不可能的。

您有一些可能的方法来提高查询性能。

  1. 如您建议的那样,从明细表中生成一些汇总表。如果您能够处理稍微陈旧的数据,则可以在一夜之间重新生成它们。

  2. 如果您使用特定的查询,请研究创建复合覆盖索引以加速这些查询

查看您问题中的查询。首先,我想它应该包含一些SUM项,就像这样。我也将您提到的内容date更改DATE(date)为仅汇总中的日期,而不是日期和时间。(也许这已经在您的表中完成了。如果是这样,就不要再这样做了。)

Select DATE(date), creative_size, device_class,ssp,billing_type, location,
       SUM(ad_impressions), SUM(clicks), SUM(revenue)
  from ADS
 group by DATE(date),creative_size,device_class,ssp,billing_type,location

其次,这个没有任何WHERE子句。如果您确实添加了WHERE子句,那么(几乎可以肯定)您需要不同的复合覆盖索引。您可以阅读有关如何在WHERE其他地方使用带有子句的覆盖索引的信息

第三,可以通过特定的复合索引来加速该查询:复合索引中GROUP BYandSELECT子句中提到的所有列上的索引GROUP BY子句中的列应在索引中排在第一位,通常与中的顺序相同GROUP BY您将创建这样的索引。

 CREATE INDEX summary_1 ON ADS 
              (date, creative_size, device_class,ssp,billing_type, location,
               ad_impressions, clicks, revenue);

这是有帮助的,因为MySQL的查询计划器可以按顺序读取索引以满足您的查询,而不必遵循指向表的指针。

第四,你可以做

CREATE TABLE ad_summary AS
Select date, creative_size, device_class,ssp,billing_type, location,
       SUM(ad_impressions), SUM(clicks), SUM(revenue)
  from ADS
 group by date,creative_size,device_class,ssp,billing_type,location;

这是一个穷人的物化观点。(如果您使用的是Oracle,则可以使用它们的物化视图,我们将它们称为以前的富人的物化视图。-以前是因为Oracle如此昂贵。)

第五,您可以对汇总表进行日期限制(如果适用于您的应用程序)。为此,可以在查询中添加类似的内容。

  WHERE date >= CURDATE() - INTERVAL 7 DAY

此特定WHERE子句可以使用相同的复合覆盖索引,因为它对进行了范围扫描date,并且该列在索引中位于第一位。

这是一些有关磨削非常大的桌子的一般观察,供您考虑。

  • 像您这样的表上的许多单列索引通常会损害性能。MySQL根本无法很好地利用单个查询的单个表中的多个索引。
  • SELECT *绝对有害的性能,尤其是当你有很多的列。而是,枚举所需的列。
  • ORDER BY除非您知道需要大型查询,否则请避免使用这些子句。
  • http://use-the-index-luke.com/是使这些工具正常工作的很好参考。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用C ++中的新增功能分配大于2GB的单个对象(在Windows上)

单个表上的简单SQL查询

如何处理tensorflow中的大(> 2GB)嵌入查询表?

要使32位应用程序在64位Windows 7上使用2GB以上的内存?

在Windows上以32位进程强制将DLL加载到2GB(0x80000000)以上

在表上查询以在单个查询中获得2个计数。

2GB系统上的64位OS的开销

内存小于 2GB 的机器上的 android studio

单个表上的嵌套查询

克服SQL Server中XML输出的2GB限制

读取大文件-2GB以上用于Google Drive API上传

为什么我不能将2GB的视频放到4GB的DVD上?

在 ubuntu 20.04 上只能识别 2GB 的 32GB RAM

如何在大表上加快Postgres查询

尝试加快大型表上的mysql查询

在 2GB USB 上的现有 Ubuntu 18.04.5 上安装 Windows 10

加快Informix的SQL查询?

在x86_64 Linux中将程序重定位到2GB以上时出现链接器错误?

当Windows 7似乎免费提供2GB以上的内存时,为什么Windows 7会说我的内存不足?

如何从表单将2GB以上的大文件上传到.NET Core API控制器?

在大型数据库上加快慢速SQL查询

为什么带有200.000条记录的SELECT表使用过多的内存(+ 2GB)?

SQL查询单个表中的更新

单个查询中的SQL Server表组合

重复使用的术语查询过滤器可加快Elasticsearch查询的速度

使用WebAPI流式传输大文件(在IIS上大于2GB)

VPS上是否有2GB RAM的32或64位OS?

JVM 64在Azure的Windows Server 2012上最多使用2GB

我可以在RAM小于2GB的PC上安装Ubuntu吗