用户表主键为用户ID,需按ID+状态查询,是否创建复合索引?
要不要创建(user id, user status)复合索引?
直接给结论:完全不需要,具体原因拆解如下:
- 你的
user id是主键,主键本身就是唯一的聚簇索引(以MySQL InnoDB为例,这是默认行为)。当你执行where id = 1时,数据库已经能通过主键索引直接定位到唯一的一行数据——主键的唯一性保证了id=1的记录最多只有一条。 - 此时
status = 1的条件,只是在找到这一行后做一个简单的字段校验,根本不需要额外索引来加速。数据库读取该行数据时,顺便就会检查status字段的值,这个操作的开销可以忽略不计。
如果强行创建(id, status)的复合索引,反而会带来额外负担:
- 浪费存储空间:复合索引会重复存储
id和status的值,而主键索引已经包含了所有行数据(聚簇索引特性),完全没必要多存一份。 - 增加维护成本:每次对user表执行插入、更新、删除操作时,数据库都需要同时维护主键索引和这个复合索引,会拖慢写操作的性能。
举个实际场景:假设你的user表有1000万条数据,用主键查id=1,数据库只需要1-2次IO就能定位到目标行;就算有复合索引,查询效率和主键索引几乎没有区别,但你却要为这个冗余索引付出存储和维护的代价。
所以放心,只用主键索引就足够支撑你的查询需求了。
内容的提问来源于stack exchange,提问作者xuewen yu
相关产品推荐
相关产品推荐

