Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 即使在创建索引方面,postgres的性能也很慢_Sql_Postgresql - Fatal编程技术网

Sql 即使在创建索引方面,postgres的性能也很慢

Sql 即使在创建索引方面,postgres的性能也很慢,sql,postgresql,Sql,Postgresql,我使用md5在postgres中为下面提到的表创建了索引。索引和表格如下所示: create table my_table(col1 character varying, col2 character varying, col3 character varying); 我的_表看起来像我刚刚给出了一个示例。我的实际表格为1个字节: col1 col2 col3 <a12> <j178> <k109> create index index

我使用md5在postgres中为下面提到的表创建了索引。索引和表格如下所示:

 create table my_table(col1 character varying, col2 character varying, col3 character varying);

我的_表看起来像我刚刚给出了一个示例。我的实际表格为1个字节:

   col1  col2   col3
   <a12> <j178> <k109>

create index index1 on my_table (md5(col1), md5(col2), md5(col2));
然而,我注意到无论是否创建了索引,我的查询处理时间都保持不变。我不知道原因是什么。有人能帮我吗

我触发的sql查询的形式如下:

select col3 from my_table where col1='<a12>' and col2='<j178>';

为每列而不是组合列创建索引。如果您为几个单独的列创建索引,postgresql查询平面可以使用它所谓的位图索引扫描来组合这些列。组合单列索引通常也同样快,您可以在引用已编制索引的列的任何查询中使用它们。为组合列创建索引不是一个好的设计

参考文献

关于md5,我在没有你更新的情况下发布了。使用md5是可以的。与其他答案一样,您还应该在where子句中使用md5,并且需要添加完整的数据比较,以考虑哈希可能发生的冲突


还有另外一种可能性。单列索引比多列组合索引有助于减少索引行大小。

为什么在创建索引时应用MD5?您可以通过存储感兴趣列的MD5值来利用哈希索引,并在该列上创建哈希索引,还可以通过该哈希值进行搜索。但我认为你不需要这些


我看到您正在创建B树索引,您应该只使用正则列,而不使用任何哈希加密。当Where子句中有直线运算符时,B树索引的性能最佳。

因为在尝试创建标准的B树索引时出现错误,我猜其中一列或多列中的数据相当大

您创建的索引最好描述为三列md5哈希的b树索引,而不是三列md5索引

为了让PostgreSQL使用索引,您的查询必须针对md5哈希。尝试:

SELECT col3
FROM my_table 
WHERE
      md5(col1) = md5('<a12>')
  and md5(col2) = md5('<j178>')
规划者会说,哦,我有一个md5col1等的索引,我会使用它。请注意,这仅适用于完全相等查询,而不适用于相似或范围查询。它也不会从索引中获取col3的值,因为只有col3的md5存储在那里,所以它仍然需要转到表中获取col3的值

对于一个小表,这可能会导致计划者决定跳过索引,只对表进行一次完整扫描,但听起来您的表足够大,索引是值得的-postgres将扫描索引,找到匹配的行条目,然后从表中检索这些行

现在,如果col3中有大量数据,而col1和col2很小,那么您可以创建一个col1,col2的正常索引。实际上,您只需要索引where子句中的列,而不需要索引select部分中的列

postgres索引文档非常好:但创建索引页面可能是最有用的页面:


找出索引是否被使用的最佳方法是使用解释说明:-如果使用pgadmin3来处理DB,我强烈推荐使用它,然后在查询窗口中按F7,它将进行解释,并在一个漂亮的GUI中显示查询计划。这节省了很多时间去尝试找出为什么我的索引没有被使用。

md5?你认为这是什么意思?我的实际表是1个字节的上帝保佑你的数据库不是复合值你能详细说明一下吗?postgresql如何使用2个分隔索引来匹配2列?@zerkms-postggresql可以使用2个分隔索引来匹配2列。
SELECT col3
FROM my_table 
WHERE
      md5(col1) = md5('<a12>')
  and md5(col2) = md5('<j178>')