如何获得大桌子的计数?[英] How to get Count for large tables?

本文是小编为大家收集整理的关于如何获得大桌子的计数?的处理方法,想解了如何获得大桌子的计数?的问题怎么解决?如何获得大桌子的计数?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

样本表:

+----+-------+-------+-------+-------+-------+---------------+
| id | col1  | col2  | col3  | col4  | col5  | modifiedTime  |
+----+-------+-------+-------+-------+-------+---------------+
|  1 | temp1 | temp2 | temp3 | temp4 | temp5 | 1554459626708 |
+----+-------+-------+-------+-------+-------+---------------+ 

上表有5000万个记录

  1. (COL1,COL2,COL3,COL4,COL5这些是Varchar柱)
  2. (ID是PK)
  3. (修改时间)

每个列都是索引

for ex:我的网站上有两个标签.

firstTab-我打印上述表的计数,并带有以下标准[col1喜欢" value1%"和col2喜欢" value2%"]

seocndtab-我打印上述表的计数,并带有以下标准[col3喜欢" value3%"]


由于我有5000万个记录,这些标准的计数需要太多时间才能获得结果.

注意:我会在某个时候更改记录数据(表中的行).插入新行.删除不需要记录.

我需要一个可行的解决方案,而不是查询整个表.例如:就像缓存较旧的人数一样.这是可能的.

推荐答案

虽然我确定MySQL可能有可能使用触发器,但这是Postgres的解决方案.

计数存储在另一个表中,每个插入/update/delete上都有一个触发器,可以检查新行是否符合条件,如果确实满足条件,则将1添加1.触发器的另一部分检查旧行是否满足条件,如果确实如此,则减去1.

这是触发器的基本代码,将行计为temp2 = '5':

CREATE OR REPLACE FUNCTION updateCount() RETURNS TRIGGER AS 
$func$
BEGIN
   IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN
      EXECUTE 'UPDATE someTableCount SET cnt = cnt + 1 WHERE 1 = (SELECT 1 FROM (VALUES($1.*)) x(id, temp1, temp2, temp3) WHERE x.temp2 = ''5'')'
      USING NEW;
   END IF;
   IF TG_OP = 'DELETE' OR TG_OP = 'UPDATE' THEN
      EXECUTE 'UPDATE someTableCount SET cnt = cnt - 1 WHERE 1 = (SELECT 1 FROM (VALUES($1.*)) x(id, temp1, temp2, temp3) WHERE x.temp2 = ''5'')'
      USING OLD;
   END IF;
   RETURN new;
END
$func$ LANGUAGE plpgsql;

nor ="nore ="noreforloll noreferrer"> dbfiddle

您当然可以修改触发代码以具有动态,在表中每个表达式和存储计数如下:

CREATE TABLE someTableCount
(
   whereExpr text,
   cnt INT
);

INSERT INTO someTableCount VALUES ('temp2 = ''5''', 0);

在触发器中,您将循环循环通过条件并进行相应更新.

其他推荐答案

firstTab-我打印上述表的计数,并带有以下标准[col1喜欢" value1%"和col2喜欢" value2%"]

将受益于"复合"索引:

INDEX(col1, col2)

因为它将"覆盖". (也就是说,查询中所需的所有列都在单个索引中找到.)

seocndtab-我打印上述表的计数,并带有以下标准[col3喜欢" value3%"]

您显然已经拥有最佳(覆盖)索引:

INDEX(col3)

现在,让我们从不同的角度看一下.您是否注意到搜索引擎不再为您提供匹配的行确切数量?您正在找出原因 - 进行TALLY 需要太长时间了,无论使用哪种技术.

由于" col1"不给我您的应用程序的线索,也没有对所计数的任何想法,所以我只能抛出一些通用建议:

  • 不要给计数.
  • 预先计算计数,将其保存在某个地方并传递"陈旧"值.如果只有几个不同的"值"计数,这可能很方便.对于任意字符串,这可能是不切实际的.
  • 在输出中说"关于nnnn".
  • 弹奏一些技巧来决定计算确切值还是只是说"关于".
  • 说"超过1000".
  • etc

如果您想描述应用程序和列,也许我可以提供一些巧妙的技巧.

您对"插入速度"表示关注.这通常是 不是问题,并且将"正确"索引的SELECTs索引的好处超过了

的轻微性能.

其他推荐答案

听起来您在需要螺丝刀时尝试使用锤子.如果您不想运行批处理计算,我建议使用流式框架(例如Flink或Samza)在添加或删除记录时从计数中添加和减去.这正是这些框架的目的.

如果您承诺使用SQL,则可以设置一个执行所需计数操作的作业,每个给定的时间窗口,并将值存储到第二个表中.这样,您就不必在同一行上执行重复计数.

本文地址:https://www.itbaoku.cn/post/1763915.html