样本表:
+----+-------+-------+-------+-------+-------+---------------+
| id | col1 | col2 | col3 | col4 | col5 | modifiedTime |
+----+-------+-------+-------+-------+-------+---------------+
| 1 | temp1 | temp2 | temp3 | temp4 | temp5 | 1554459626708 |
+----+-------+-------+-------+-------+-------+---------------+
上表有5000万条记录
- (col1、col2、col3、col4、col5 这些是 VARCHAR 列)
- (id为PK)
- (修改时间)
每列都有索引
例如:我的网站中有两个选项卡。
FirstTab - 我使用以下条件打印上表的计数 [col1 如“value1%”,col2 如“value2%”]
SeocndTab - 我使用以下条件打印上表的计数 [col3 like“value3%”]
由于我有 5000 万条记录,因此按照这些标准进行计数需要很长时间才能得到结果。
注意:我有时会更改记录数据(表中的行)。插入新行。删除不需要的记录。
我需要一个可行的解决方案,而不是查询整个表。例如:就像缓存旧计数一样。这样的事有可能吗?
虽然我确信 MySQL 可以这样做,但这里有一个使用触发器的 Postgres 解决方案。
计数存储在另一个表中,每次插入/更新/删除时都有一个触发器检查新行是否满足条件,如果满足,则将计数加 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;
.
您当然可以修改触发器代码以具有动态 where 表达式并为表中的每个表达式存储计数,例如:
CREATE TABLE someTableCount
(
whereExpr text,
cnt INT
);
INSERT INTO someTableCount VALUES ('temp2 = ''5''', 0);
然后,您将在触发器中循环条件并进行相应更新。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)