我有一个大表(90 GB(,里面有数据:
col1 col2
----------------------
1 str1 one
2 str2 two
3 str3 three
4 str2 two
5 str1 seven
6 str4 seven
7 str3 three
col1是字符变化类型,而col2则是varchar型。col1_idx索引已在col1列上创建。
为了不单独执行许多查询,如:
SELECT * FROM table_name WHERE col1='str1';
我做了一个查询来查找col1列上的匹配项,如下所示:
SELECT * FROM table_name WHERE col1 in ('str1', 'str4')
作为请求的结果,我得到:
['str1:one', 'str1:seven', 'str4:seven']
但在第一种和第二种情况下,查询的执行速度都非常慢(>20分钟(。计算机资源(处理器、内存和硬盘(几乎没有被使用。告诉我如何修复此查询或调整数据库以加快在col1列上搜索匹配项?我安装了PostgresQL12数据库。
UPD1:在大小为2Gb的小型数据库中执行120000行的小型查询(EXPLAIN ANALYZE SELECT(:
.....[]))">, <Record QUERY PLAN='Planning Time: 88.939 ms'>, <Record QUERY PLAN='Execution Time: 3026.371 ms'>]
通过在索引中包括其他列来使用仅索引扫描。这样,就不需要查找表了。
例如:
CREATE INDEX table_name ON table_name(col1) INCLUDE (col2);
如果col1值对";str1";以及";str4";
此外,为了减小表的大小,最好使用尽可能小的列的字符长度