在 PostgreSQL 中,建立索引主要使用 CREATE INDEX 语句。下面按常见场景给你梳理一下。
CREATE INDEX 索引名
ON 表名 (列名);
示例:
CREATE INDEX idx_user_name
ON users (name);
适合 =, <, >, BETWEEN, ORDER BY
CREATE INDEX idx_users_age ON users (age);
保证列值不重复
CREATE UNIQUE INDEX idx_user_email
ON users (email);
或在建表时:
CREATE TABLE users (
id serial PRIMARY KEY,
email text UNIQUE
);
CREATE INDEX idx_users_name_age
ON users (name, age);
⚠️ 注意最左前缀原则:
(name)、(name, age)(age)只对部分数据建索引,节省空间、提升性能
CREATE INDEX idx_active_users
ON users (name)
WHERE status = 'active';
对函数或表达式建索引
CREATE INDEX idx_lower_email
ON users (lower(email));
查询时需匹配:
SELECT * FROM users WHERE lower(email) = 'a@b.com';
CREATE INDEX idx_article_content
ON articles
USING gin (to_tsvector('english', content));
CREATE INDEX idx_tags
ON posts USING gin (tags);
生产环境推荐:
CREATE INDEX CONCURRENTLY idx_users_name
ON users (name);
⚠️ 注意:
DROP 后重建查看索引:
\d 表名
-- 或
SELECT * FROM pg_indexes WHERE tablename='users';
删除索引:
DROP INDEX idx_users_name;
✅ 常用于 WHERE、JOIN、ORDER BY 的列
✅ 大表优先用 CONCURRENTLY
❌ 不要盲目建索引(影响写入性能)
如果你有具体表结构或查询 SQL,我可以帮你设计最合适的索引方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。