加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL忽略timestamp列上的索引

发布时间:2020-12-13 16:08:38 所属栏目:百科 来源:网络整理
导读:我创建了以下表和索引: CREATE TABLE cdc_auth_user( cdc_auth_user_id bigint NOT NULL DEFAULT nextval('cdc_auth_user_id_seq'::regclass),cdc_timestamp timestamp without time zone DEFAULT ('now'::text)::timestamp without time zone,cdc_operatio
我创建了以下表和索引:

CREATE TABLE cdc_auth_user
(
  cdc_auth_user_id bigint NOT NULL DEFAULT nextval('cdc_auth_user_id_seq'::regclass),cdc_timestamp timestamp without time zone DEFAULT ('now'::text)::timestamp without time zone,cdc_operation text,id integer,username character varying(30)
);

CREATE INDEX idx_cdc_auth_user_cdc_timestamp
          ON cdc_auth_user
       USING btree (cdc_timestamp);

但是,当我使用timestamp字段执行select时,索引将被忽略,我的查询将花费大约10秒的时间返回:

EXPLAIN SELECT *
          FROM cdc_auth_user
         WHERE cdc_timestamp BETWEEN '1900/02/24 12:12:34.818'
                             AND '2012/02/24 12:17:45.963';


Seq Scan on cdc_auth_user  (cost=0.00..1089.05 rows=30003 width=126)
  Filter: ((cdc_timestamp >= '1900-02-24 12:12:34.818'::timestamp without time zone) AND (cdc_timestamp <= '2012-02-24 12:17:45.963'::timestamp without time zone))

解决方法

如果有很多结果,btree可能比只进行表扫描要慢. btree索引真的不是为你在这里做的那种“范围选择”类型的查询而设计的;条目放在一个大的未排序文件中,索引是针对该未排序的组构建的,因此每个结果在btree中找到后都可能需要磁盘搜索.当然,btree可以很容易地按顺序读取,但结果仍然需要从磁盘中提取.

Clustered索引通过根据btree中的内容对实际数据库记录进行排序来解决此问题,因此它们实际上对这样的远程查询很有帮助.请考虑使用聚簇索引,看看它是如何工作的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读