Erdmates Logo
Erdmates
返回博客
索引SQL性能优化B-Tree

数据库索引完全指南:将查询性能提升10倍的方法

从数据库索引的基本原理到实战应用。理解B-Tree索引、复合索引、覆盖索引,大幅改善查询性能。

2026年2月28日9 分钟阅读

什么是数据库索引?

数据库索引(Index)就像书籍的索引目录。查找特定词汇时,不需要从头翻阅每一页,只需查看索引页。同样,数据库索引是一种数据结构,能在不扫描所有行的情况下快速找到目标数据行。

没有索引时,数据库必须执行**全表扫描(Full Table Scan)**来查找满足条件的数据。如果有100万行,最差情况下需要100万次比较。创建合适的索引可以将其减少到几十到几百次。

B-Tree索引的原理

大多数关系型数据库(PostgreSQL、MySQL、Oracle)使用**B-Tree(平衡树)**作为默认索引结构。

B-Tree特性:

  • 所有叶节点位于同一深度(保持平衡)
  • 每个节点包含有序键值
  • 基于键值进行二分查找
  • O(log n) 的时间复杂度

即使有1000万条数据,B-Tree高度也仅约24层,意味着最多24次比较即可找到目标数据。

索引创建基本语法

-- 单列索引
CREATE INDEX idx_users_email ON users(email);

-- 唯一索引
CREATE UNIQUE INDEX idx_users_email_unique ON users(email);

-- 复合索引
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at);

-- 删除索引
DROP INDEX idx_users_email;

-- 查看索引列表(PostgreSQL)
SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'users';

复合索引与列顺序

复合索引将多列合并为一个索引。列的顺序对性能有决定性影响,这称为最左前缀规则。

CREATE INDEX idx_orders_composite ON orders(user_id, created_at, status);

-- 可以使用索引(按从左到右顺序使用条件)
SELECT * FROM orders WHERE user_id = 1;
SELECT * FROM orders WHERE user_id = 1 AND created_at > '2026-01-01';

-- 无法使用索引(缺少第一列条件)
SELECT * FROM orders WHERE created_at > '2026-01-01';

基数(Cardinality)与选择性

基数指列中唯一值的数量,是决定索引效果的关键因素。

列值示例基数索引效果
user_idUUID非常高优秀
email邮箱地址高良好
statuspaid/pending/failed低(3个值)有限
genderM/F极低几乎无效

覆盖索引

当查询所需的所有列都包含在索引中时,数据库无需访问主表即可直接返回结果。

CREATE INDEX idx_users_covering ON users(id, name, email);

-- 此查询仅通过索引即可处理
SELECT id, name, email FROM users WHERE id = 123;

-- PostgreSQL的INCLUDE子句
CREATE INDEX idx_orders_user ON orders(user_id) INCLUDE (total_amount, status);

使用EXPLAIN验证索引效果

EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 1;
-- Index Scan   → 使用了索引
-- Seq Scan     → 全表扫描(未使用索引)

索引设计原则

  1. 优先为WHERE子句的列创建索引
  2. JOIN条件(外键)必须创建索引
  3. 经常用于ORDER BY的列
  4. 复合索引中将基数高的列放在前面
  5. 索引越多,INSERT/UPDATE/DELETE速度越慢

总结

索引是数据库性能优化的核心工具,但并非越多越好。需要分析实际查询的执行计划,在关键位置战略性地创建索引。使用Erdmates设计表结构的同时,制定最优的索引策略。

立即使用Erdmates开始

使用AI驱动的ERD编辑器开始数据库设计。免费使用。

免费试用演示免费开始

相关文章

bigint、UUID v4 还是 UUID v7?主键选择指南(含 PostgreSQL 18 的 uuidv7())

比较 bigint、UUID v4 和 UUID v7 主键的优缺点,介绍 PostgreSQL 18 内置的 uuidv7() 带来的变化,以及不同场景下的选择方法。

被AI代理读取的数据库:MCP时代的模式设计原则

AI代理通过MCP直接连接数据库的情况越来越多。本文整理如何设计名称、注释和约束,让代理不会误解模式,以及如何安全地划分权限。

PostgreSQL 19预览:影响模式设计与运维的变化(基于Beta 4)

以官方发布说明(Beta 4)为准,整理即将正式发布的PostgreSQL 19的变更中直接影响表设计、迁移和运维的内容。同时介绍在Beta阶段被撤回的功能,以及升级前需要确认的行为变化。

Erdmates Logo
Erdmates

使用自然语言设计数据库,通过AI驱动的ERD编辑器与团队实时协作。

服务

  • 功能介绍
  • 价格方案
  • 演示
  • SQL 转 ERD

资源

  • 博客
  • 帮助
  • 联系我们

法律声明

  • 服务条款
  • 隐私政策
  • 第三方提供
公司名称: Produx|代表人: 최정회
地址: 강원특별자치도 원주시 솔우물2길 4-1 (무실동)
电子邮件: master@erdmates.com
隐私保护负责人: 최정회|托管服务提供商: Amazon Web Services

© 2026 Produx. 版权所有。