EAV(Entity-Attribute-Value,实体-属性-值)模型因为“宽表变窄表、行存属性”,在传统关系型数据库里索引设计非常关键,否则查询会全表扫描、性能崩。下面按“原则 → 常见索引 → 查询模式对应建法 → 实战示例”系统讲。
entity_id BIGINT
attribute_id INT
value VARCHAR / TEXT / NUMERIC
常配合:
entities 表(实体主表)attributes 表(属性元数据)CREATE INDEX idx_eav_ea ON eav(entity_id, attribute_id);
✅ 适用:
CREATE INDEX idx_eav_ae ON eav(attribute_id, value);
✅ 适用:
WHERE attribute_id = 10 AND value = 'VIP'
⚠️ 如果 value 是文本且很长:
CREATE INDEX idx_eav_ae_pref ON eav(attribute_id, value(50));
CREATE INDEX idx_eav_num ON eav(attribute_id, CAST(value AS NUMERIC));
或 分表:
eav_int
eav_decimal
eav_text
WHERE entity_id = 123
✅ 索引:(entity_id)
WHERE attribute_id = 1 AND value = 'active'
✅ 索引:(attribute_id, value)
entity_id IN (
SELECT entity_id FROM eav WHERE attribute_id=1 AND value='active'
)
AND entity_id IN (
SELECT entity_id FROM eav WHERE attribute_id=2 AND value>'100'
)
✅ 解决方案:
users (
id,
status,
level,
created_at
)
EAV 只存“扩展属性”
eav_string
eav_int
eav_datetime
索引简单、查询快
ALTER TABLE users ADD attrs JSONB;
CREATE INDEX idx_attrs ON users USING gin(attrs);
✅ PostgreSQL 推荐
❌ 只对 value 建索引
❌ 对 TEXT value 建完整索引
❌ 在 EAV 上做复杂 JOIN + 排序
EAV 索引 = (entity_id, attribute_id) 打底 + (attribute_id, value) 补查询 + 类型分表 / JSON 才是正道
如果你愿意,可以告诉我:
我可以直接帮你画索引方案或写 DDL。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。