
在前面几篇帖子中,我们学习了 GaussDB 的数据类型、操作符以及清空表命令。今天,我们来聊聊数据库性能优化的核心利器——索引(Index)。合理使用索引,能让查询速度从“龟速”变“闪电”;但滥用索引,也可能拖慢写入性能。本文将介绍如何在GaussDB中创建索引,并说明 使用索引的核心好处与注意事项。
一、什么是索引?
索引是数据库中用于加速数据检索的数据结构(类似书籍的目录)。
类比:查字典时,如果按拼音目录找“张”,比一页页翻快得多——这就是索引的作用。
二、如何创建索引?
GaussDB 使用CREATE INDEX语句创建索引,基本语法如下:
-- 创建普通 B-tree 索引(最常用)
CREATE INDEX index_name ON table_name (column_name);
-- 创建多列复合索引
CREATE INDEX idx_user_name_age ON users (name, age);
-- 创建唯一索引(禁止重复值)
CREATE UNIQUE INDEX idx_user_email ON users (email);
-- 创建部分索引(只索引满足条件的行)
CREATE INDEX idx_active_users ON users (id) WHERE status = 'active';
常用索引类型(GaussDB 默认为 B-tree):
三、使用索引的好处
好处 | 说明 |
1. 加速查询 | WHERE、JOIN、ORDER BY、GROUP BY等操作显著提速。 |
2. 保证数据唯一性 | 唯一索引(UNIQUE)可防止重复数据插入。 |
3. 优化排序与分组 | 避免临时排序(filesort),提升ORDER BY效率。 |
4. 支持覆盖索引 | 若查询字段都在索引中,无需回表,直接返回结果(极高效)。 |
示例:索引前后性能对比
-- 无索引:全表扫描 100 万行
SELECT * FROM orders WHERE user_id = 123;-- 耗时 800ms
-- 创建索引后:直接定位
CREATE INDEX idx_orders_user ON orders (user_id);
SELECT * FROM orders WHERE user_id = 123;-- 耗时 5ms
四、使用索引的注意事项
虽然索引好处多,但不是越多越好!需注意以下几点:
注意事项 | 说明 |
1.写入性能下降 | 每次 INSERT/UPDATE/DELETE 都需维护索引,增加开销。 |
2.占用存储空间 | 索引本身需要磁盘空间(大表索引可能比数据还大)。 |
3.并非所有查询都走索引 | 如 LIKE '%abc'(前导通配符)、函数包裹字段(WHERE UPPER(name) = 'ALICE')会导致索引失效。 |
4.复合索引顺序很重要 | (a, b, c)索引可支持 WHERE a=1 AND b=2,但不支持WHERE b=2 AND c=3(最左前缀原则)。 |
五、何时该建索引?
推荐建索引的场景:
不建议建索引的场景:
六、查看索引是否生效
使用EXPLAIN分析执行计划,确认是否使用索引:
EXPLAIN SELECT * FROM users WHERE email = 'alice@example.com';
若输出中包含Index Scan,说明索引已命中;若为Seq Scan,则未使用索引。
七、总结
特性 | 说明 |
核心作用 | 加速查询、保证唯一、优化排序 |
创建方式 | CREATE INDEX idx_name ON table (col); |
最佳实践 | 选高选择性列、遵循最左前缀、避免过度索引 |
风险提示 | 写入变慢、占用空间、可能失效 |
口诀:“查得快,靠索引;写得慢,因索引;用得巧,性能高;乱建索引反成扰!”
以上内容均为本人学习 GaussDB 过程中,针对实操遇到的问题、学习产生的疑惑所做的个人总结与经验梳理,初衷是希望能为同路学习者提供一点参考和帮助。内容仅作交流学习之用,若有疏漏或不当之处,欢迎大家指正交流。
本文由le就这样吧原创发布于社区,未经作者许可,禁止转载。





