如题,我们知道在做SQL查询时,索引可以极大提高我们的查询效率,我想问的是,如果我的查询条件是有多个字段组成的,那是否需要给这些有包含在where查询里的字段添加个组合索引?比如,有如下查询语句:
select *from student where age>20 and sex='boy' and score>90 and hadPay=1
SELECT * FROM users WHERE city='北京' AND age>30; -- 建议建 (city, age)
-- 假设 city 有100个值,gender 有2个值,优先 (city, gender) SELECT * FROM users WHERE city='上海' AND gender='F';
-- 索引 (city, age) 包含所有SELECT字段,无需回表 SELECT city, age FROM users WHERE city='深圳' AND age=25;
-- 若经常单独查 age 或单独查 city,分别建单列索引 SELECT * FROM users WHERE age>25; SELECT * FROM users WHERE city='广州';
-- 高频查询:按城市和年龄筛选 CREATE INDEX idx_city_age ON users (city, age);
-- 低频组合查询,且常单独查性别 CREATE INDEX idx_gender_age ON users (gender, age); -- 性别区分度低,效果差
1. 组合索引的优势
减少数据扫描:当多个条件常一起出现时,组合索引能快速定位数据,避免全表扫描。
覆盖索引:若索引包含查询所需的所有字段(如SELECT的列),可避免回表,显著提升性能。
最左前缀匹配:组合索引支持从左到右的条件组合(如索引(A,B,C)对A=1 AND B=2生效,但单独B=2可能不生效)。
2. 何时需要建组合索引?
高频联合查询:多个字段频繁同时出现在WHERE条件中。
高选择性字段在前:将区分度高(唯一值多)的字段放在组合索引左侧。
覆盖索引需求:若查询仅需索引中的字段,直接返回结果。
3. 何时不需要组合索引?
条件独立出现:若字段常单独使用,单独索引可能更优。
低选择性字段:如性别、状态等区分度低的字段,组合索引效果有限。
写多读少场景:频繁插入/更新的表,组合索引会增加维护成本。
示例场景
推荐组合索引:
不推荐组合索引:
总结
优先组合索引:当多个字段高频联合查询,且符合最左前缀原则。
慎用组合索引:若字段常单独使用、数据更新频繁,或选择性过低。