Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
PostgreSQL通过电子邮件栏加快搜索速度_Sql_Postgresql_Indexing_Query Performance - Fatal编程技术网

PostgreSQL通过电子邮件栏加快搜索速度

PostgreSQL通过电子邮件栏加快搜索速度,sql,postgresql,indexing,query-performance,Sql,Postgresql,Indexing,Query Performance,我在PostgreSQL数据库中有一个表,有近6000万条记录。表的列email_id定义为 character varying(64) 我正试图通过这根柱子优化搜索。例如,查询: select count(1) from my_table where email_id = 'some@email.com'; 完成并返回结果大约需要190秒。我尝试在该列上创建索引,如下所示: CREATE INDEX my_table_idx_email_id ON my_table USING b

我在PostgreSQL数据库中有一个表,有近6000万条记录。表的列email_id定义为

character varying(64)
我正试图通过这根柱子优化搜索。例如,查询:

select count(1) from my_table where email_id = 'some@email.com';
完成并返回结果大约需要190秒。我尝试在该列上创建索引,如下所示:

CREATE INDEX my_table_idx_email_id
  ON my_table
  USING btree
  (email_id);
但没有明显的改善,甚至根本没有改善。我还尝试用explain analyze语句分析查询,并确认问题出在电子邮件栏中

  • 可能改进这种情况的一种方法是让表customers和my_表中的整数外键成为customers。目前,这是不可能或很难实现的,因为客户位于不同的数据库中。我在努力寻找其他的可能性
  • 我可以更改电子邮件id列的数据类型。更改为更合适的方式是否可以加快查询速度
  • 我是否应该使用其他索引或类似“电子邮件”的全文搜索
  • 解释分析的示例输出:

    explain analyze select count(1) from my_table where email_id = 'test@unknown.email';
                                                               QUERY PLAN
    --------------------------------------------------------------------------------------------------------------------------------
     Aggregate  (cost=5211284.25..5211284.26 rows=1 width=0) (actual time=225424.749..225424.749 rows=1 loops=1)
       ->  Seq Scan on my_table  (cost=0.00..5211235.72 rows=19410 width=0) (actual time=225424.744..225424.744 rows=0 loops=1)
             Filter: ((email_id)::text = 'test@unknown.email'::text)
     Total runtime: 225426.646 ms
    
    解释启用后分析输出\u seqscan=off:

    SET enable_seqscan = off;
    explain analyze select count(1) from my_table where email_id = 'test@unknown.email';
                                                                      QUERY PLAN
    ----------------------------------------------------------------------------------------------------------------------------------------------
     Aggregate  (cost=10005215244.40..10005215244.41 rows=1 width=0) (actual time=282110.404..282110.405 rows=1 loops=1)
       ->  Seq Scan on my_table  (cost=10000000000.00..10005215195.84 rows=19425 width=0) (actual time=282110.393..282110.393 rows=0 loops=1)
             Filter: ((email_id)::text = 'test@unknown.email'::text)
     Total runtime: 282113.296 ms
    

    explain analyze的输出是什么?用输出更新了我的问题。通过
    设置enable_seqscan=OFF,你有什么计划?在启用顺序扫描后用输出更新。仍然很慢…看起来该表上没有任何可以使用的索引,但是您提供了应该在第二个查询中使用的索引代码。怎么会?