You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MySQL中UNSIGNED、UNIQUE字段是否需建索引?添加索引语句是否正确?

关于MySQL中UNSIGNED/UNIQUE字段的索引疑问解答

先直接给你结论:你代码里的KEY phone (phone)是多余且没必要的,而KEY status (status)是否正确,完全取决于你的业务使用场景。下面详细拆解原因:

1. UNIQUE约束的字段:MySQL会自动创建唯一索引

当你给字段加上UNIQUE约束时,MySQL会自动为该字段生成一个唯一索引——这个索引的核心作用就是保证字段值的唯一性,和你手动创建的普通索引功能重叠但优先级更高。所以你额外添加的KEY phone (phone)属于重复创建索引,不仅会浪费存储空间,还会降低插入、更新数据的效率(因为每次写操作都要维护两个索引)。

你可以执行SHOW INDEX FROM seller;命令查看表的索引详情,会发现phone字段已经存在一个Non_unique=0的唯一索引,这就是UNIQUE约束自动生成的。

2. UNSIGNED属性的字段:是否建索引看业务需求

UNSIGNED只是限制字段的取值范围(只能存储非负整数),它和索引没有强制绑定关系。要不要给status建索引,得看你会不会在业务中用这个字段做以下操作:

  • 作为查询条件(比如WHERE status = 2
  • 用于排序(比如ORDER BY status DESC
  • 进行分组统计(比如GROUP BY status
  • 作为关联表的连接条件

如果你的业务经常有上述操作,那添加KEY status (status)是完全正确的;如果这个字段几乎不会被用来查询或排序,那建索引反而会增加写操作的开销,就没必要加。

修正后的CREATE TABLE语句示例(假设业务需要status索引)

CREATE TABLE seller ( 
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `status` INT(11) UNSIGNED NOT NULL, 
    `phone` VARCHAR(20) UNIQUE NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `status` (`status`) 
);

内容的提问来源于stack exchange,提问作者Dance

火山引擎 最新活动