postgresql大数据查询加索引和不加索引耗时总结

本文详细介绍了一个大数据表的创建过程,包括表结构设计、数据插入函数的编写,以及通过对比索引前后查询时间来评估索引效果的方法。实验结果显示,在查询结果少于1000条时,索引能显著提升查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、创建测试表

CREATE TABLE big_data
(
  id character varying(50) NOT NULL,
  name character varying(50),
  datetime timestamp with time zone,
  CONSTRAINT big_data_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE big_data
  OWNER TO postgres;

2、创建插入数据函数

CREATE OR REPLACE FUNCTION insert_bigdata()
  RETURNS text AS
$BODY$
declare ii integer;
declare jj integer;
begin

    ii = 1;
    jj = 1;
    FOR ii IN 1..10 LOOP
        FOR jj IN 1..10000 LOOP
            INSERT INTO big_data values(uuid_generate_v4(), 'lisi'||jj, now());
        END LOOP;
    END LOOP;
    RETURN 'success';
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION insert_bigdata()
  OWNER TO postgres; 

3、插入一千万条数据(修改函数中的循环次数,多执行几次,插入需要的数据)

select insert_bigdata();

4、给name字段不加索引和加索引分别统计执行时间

查询结果10条记录

select * from big_data where name='lisi10';

查询结果100条记录
select * from big_data where name='lisi100';

查询结果1000条记录
select * from big_data where name='lisi1000';

查询结果10000条记录
select * from big_data where name='lisi10000';

查询结果100000条记录
select * from big_data where name='lisi100000';

耗时统计表(单位/毫秒)

耗时统计图

5、结果总结

在查询结果小于1000条记录时,加索引会大幅度提高查询效率。

在查询结果大于1000条记录时,加索引对查询效率的提升逐渐减小,尤其是超过10000条时,使用索引后的查询时间也比较长。

当前结果仅适用于创建的big_data这张数据表(如果数据表中字段比较多,数据量比较大,会在更小的查询结果记录数出现加索引查询效率提升不明显的问题)。

<think>好的,我需要帮助用户理解如何通过创建索引来优化数据查询性能。首先,我应该回顾一下索引的基本原理,比如索引是如何工作的,为什么能查询速度。根据引用[2],索引通过减少需要扫描的数据量来提升查询效率,这可能类似于书中的目录结构。 接下来,用户可能需要知道具体如何选择哪些列创建索引。根据引用[1]引用[3],应该考虑常用于查询件、连接件或排序分组的字段。例如,在WHERE子句中的列或者经常用于JOIN的列。不过,也要注意索引的维护成本,过索引会影响写入性能,所以需要平衡。 然后,可能需要解释不同类型的索引,比如B树索引、哈希索引、全文索引等,以及它们适用的场景。比如,B树索引适用于范围查询,而哈希索引适合等值查询。这部分引用中没有详细提到,但根据常识,可能需要补充说明。 另外,复合索引的使用也很重要,比如如何选择复合索引的列顺序,以及最左前缀原则。引用[1]提到复合索引需要根据查询模式设计,可能需要结合具体例子说明。 还需要提醒用户定期维护索引,比如重建或重新组织索引,以及更新统计信息,这样查询优化器才能做出正确的执行计划。引用[1]引用[3]都提到了统计信息的重要性。 最后,应该提到一些实际操作的注意事项,比如避免在频繁更新的列上建索引,监控索引的使用情况,删除不必要的索引等。这些内容在引用中也有涉及,需要整合到回答中。 现在需要把这些点组织成一个结构清晰的回答,分步骤解释,同时引用相关的引用资料。还要确保使用正确的LaTeX格式,比如行内公式用$...$,独立公式用$$...$$,但这里可能数学公式较少,需要注意是否有必要使用。同时生成相关问题,可能涉及索引类型、复合索引设计、索引维护等。</think>通过创建索引优化数据查询性能主要涉及以下关键步骤: ### 一、索引的作用原理 索引通过构建$B+$树或哈希表等数据结构,将数据表中的关键字段值其物理位置建立映射关系。例如,B树索引的时间复杂度为$O(\log n)$,相比全表扫描的$O(n)$显著降低查询耗时[^2]。 ### 二、索引创建策略 1. **选择高频查询字段** - 为`WHERE`子句中的过滤件字段创建索引(如`WHERE user_id=123`) - 为`JOIN`操作涉及的关联字段创建索引 - 对`ORDER BY`或`GROUP BY`的排序字段建立索引 2. **复合索引设计** 复合索引列顺序应遵循**最左前缀原则**。例如索引$(a,b,c)$可支持以下查询: ```sql WHERE a=1 AND b>5 ORDER BY a,b,c ``` 但无法支持单独使用$b$或$c$的查询[^1] 3. **索引类型选择** | 索引类型 | 适用场景 | |------------|----------------------------| | B+树索引 | 范围查询、排序操作 | | 哈希索引 | 精确匹配查询(如=、IN) | | 全文索引 | 文本字段的关键词搜索 | ### 三、索引维护要点 1. **定期更新统计信息** 执行`ANALYZE TABLE`命令更新索引基数信息,帮助优化器选择最佳执行计划[^3] 2. **监控索引使用率** 通过数据库管理工具(如Oracle的`V$SQL_PLAN`)识别未使用的索引 3. **平衡读写性能** 每个INSERT/UPDATE/DELETE操作都会触发索引更新,建议单表索引不超过5-7个[^1] ### 四、操作示例(MySQL) ```sql -- 创建复合索引 CREATE INDEX idx_name_age ON employees(last_name, age); -- 查看索引使用情况 EXPLAIN SELECT * FROM employees WHERE last_name='Smith' AND age>30; ``` ### 五、注意事项 - 避免在低区分度字段(如性别)建索引 - 对文本字段使用前缀索引:`CREATE INDEX idx_content ON articles(content(20))` - 对NULL值较的字段使用`FILTERED INDEX`(Oracle)或`WHERE`索引PostgreSQL
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值