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




