exo*_*dar 5 sql postgresql indexing
我创建了以下表和索引:
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);
Run Code Online (Sandbox Code Playgroud)
但是,当我使用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))
Run Code Online (Sandbox Code Playgroud)
如果有很多结果,btree 可能比仅仅进行表扫描慢。btree 索引实际上并不是为您在这里执行的这种“范围选择”类型的查询而设计的;这些条目被放置在一个大的未排序文件中,并且索引是针对该未排序组构建的,因此每个结果在 btree 中找到后都可能需要进行磁盘查找。当然,btree 可以很容易地按顺序读取,但结果仍然需要从磁盘中获取。
聚集索引通过根据 btree 中的内容对实际数据库记录进行排序来解决这个问题,因此它们实际上对于像这样的范围查询很有帮助。考虑使用聚集索引,看看它是如何工作的。
| 归档时间: |
|
| 查看次数: |
2463 次 |
| 最近记录: |