vin*_*eth 5 mysql sql database postgresql performance
样本表:
+----+-------+-------+-------+-------+-------+---------------+
| id | col1 | col2 | col3 | col4 | col5 | modifiedTime |
+----+-------+-------+-------+-------+-------+---------------+
| 1 | temp1 | temp2 | temp3 | temp4 | temp5 | 1554459626708 |
+----+-------+-------+-------+-------+-------+---------------+
Run Code Online (Sandbox Code Playgroud)
上表有5000万条记录
每列都有索引
例如:我的网站中有两个选项卡。
FirstTab - 我使用以下条件打印上表的计数 [col1 如“value1%”,col2 如“value2%”]
SeocndTab - 我使用以下条件打印上表的计数 [col3 like“value3%”]
由于我有 5000 万条记录,因此按照这些标准进行计数需要很长时间才能得到结果。
注意:我有时会更改记录数据(表中的行)。插入新行。删除不需要的记录。
我需要一个可行的解决方案,而不是查询整个表。例如:就像缓存旧计数一样。这样的事有可能吗?
在 Postgres 中,您可以从查询规划器管理的内部统计信息中获取估计的行数:
SELECT reltuples AS approximate_row_count FROM pg_class WHERE relname = 'mytable';
Run Code Online (Sandbox Code Playgroud)
这里有更多详细信息:https://wiki.postgresql.org/wiki/Count_estimate
您可以先创建一个物化视图。像这样的东西:
CREATE MATERIALIZED VIEW mytable AS SELECT * FROM the_table WHERE col1 like "value1%" and col2 like "value2%";`
Run Code Online (Sandbox Code Playgroud)
您还可以直接具体化计数查询。如果您有 10 个选项卡,那么您应该必须具体化 10 个视图:
CREATE MATERIALIZED VIEW count_tab1 AS SELECT count(*) FROM the_table WHERE col1 like "value1%" and col2 like "value2%";`
CREATE MATERIALIZED VIEW count_tab2 AS SELECT count(*) FROM the_table WHERE col2 like "value2%" and col3 like "value3%";`
...
Run Code Online (Sandbox Code Playgroud)
每次插入后,您应该刷新视图(异步):
REFRESH MATERIALIZED VIEW count_tab1
REFRESH MATERIALIZED VIEW count_tab2
...
Run Code Online (Sandbox Code Playgroud)