news 2026/8/16 14:02:31

MySQL如何加唯一索引

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL如何加唯一索引
一、唯一索引的核心价值

唯一索引是MySQL中保证数据完整性的重要工具,它强制要求索引列的值必须唯一(允许NULL值,但多NULL值会被视为不同值)。与主键索引不同,唯一索引允许存在多个,且不隐含非空约束。典型应用场景包括:

  • 用户邮箱/手机号唯一验证
  • 订单号防重复
  • 商品SKU编码唯一性约束
二、建表时添加唯一索引

语法模板

CREATETABLEtable_name(column1 datatypeUNIQUE,-- 单列唯一索引column2 datatype,...,UNIQUE(col_a,col_b)-- 多列组合唯一索引);

实战示例

CREATETABLEusers(idINTAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50)NOTNULLUNIQUE,-- 单列唯一索引emailVARCHAR(100)NOTNULL,phoneVARCHAR(20),INDEXidx_email_phone(email,phone)UNIQUE-- 组合唯一索引);

效果验证
插入重复用户名或(email+phone)组合时,MySQL将抛出ERROR 1062 (23000): Duplicate entry错误。

三、建表后添加唯一索引

方法1:ALTER TABLE(推荐)

ALTERTABLEproductsADDUNIQUEuk_product_sku(sku);-- 单列索引ALTERTABLEordersADDUNIQUEuk_order_user_time(user_id,order_time);-- 组合索引

方法2:CREATE INDEX

CREATEUNIQUEINDEXidx_unique_usernameONcustomers(username);
四、进阶操作与注意事项

1. 索引命名规范
建议使用前缀uk_(Unique Key)或uniq_开头,如uk_user_email,便于维护。

2. 处理冲突数据
添加唯一索引前,需先清理重复数据:

-- 查找重复数据SELECTcol,COUNT(*)FROMtable_nameGROUPBYcolHAVINGCOUNT(*)>1;-- 删除重复记录(保留最新)DELETEt1FROMtable_name t1INNERJOINtable_name t2WHEREt1.id>t2.idANDt1.col=t2.col;

3. 性能影响评估

  • 写操作性能下降(约10-30%)
  • 查询速度提升(尤其在WHERE/ORDER BY场景)
  • 索引占用存储空间(约表大小的1.2-1.5倍)

4. 特殊场景处理

  • 忽略重复插入:使用INSERT IGNORE
    INSERTIGNOREINTOusers(username)VALUES('john');
  • 条件唯一索引(MySQL 8.0+):
    CREATETABLElogs(idINT,event_dateDATE,UNIQUE(id,event_date)-- 仅当event_date在最近30天时生效)PARTITIONBYRANGECOLUMNS(event_date);
五、最佳实践建议
  1. 前缀索引优化:对长文本列使用前缀索引
    ALTERTABLEarticlesADDUNIQUE(title(50));-- 仅索引前50字符
  2. 避免过度索引:高频写入表建议不超过5个索引
  3. 监控索引碎片:定期执行OPTIMIZE TABLE重建索引
  4. 联合索引顺序:将区分度高的列放在组合索引左侧

完整示例SQL

-- 创建商品表并添加唯一索引CREATETABLEproducts(idINTAUTO_INCREMENTPRIMARYKEY,skuVARCHAR(20)NOTNULL,nameVARCHAR(100)NOTNULL,priceDECIMAL(10,2)NOTNULL,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,CONSTRAINTuk_product_skuUNIQUE(sku)-- 命名约束)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;-- 添加组合唯一索引(订单号+用户ID)ALTERTABLEordersADDUNIQUEuk_order_user(order_number,user_id);

总结
MySQL唯一索引是保障数据一致性的重要防线。通过合理的索引设计,可以在保证数据质量的同时提升查询性能。实际操作中需平衡读写性能、存储空间和业务需求,定期使用EXPLAIN分析索引使用效率,持续优化索引策略。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/15 20:41:25

从 Redis 缓存设计谈起:如何避免缓存击穿、穿透与雪崩

在高并发系统中,Redis 往往并不是“锦上添花”的组件,而是直接决定系统能否扛住流量的核心基础设施。缓存设计做得好,数据库压力可以下降一个数量级;反过来,缓存设计一旦失误,在流量高峰时甚至会成为“放大…

作者头像 李华
网站建设 2026/8/9 10:15:50

AI优化哪家专业

引言:AI优化成企业数字化转型核心刚需,专业服务商成破局关键随着人工智能技术渗透到各行各业,企业对AI优化的需求呈爆发式增长——从推荐系统的精准度提升,到生产流程的效率优化,再到客户服务的智能升级,AI…

作者头像 李华
网站建设 2026/8/9 21:11:50

计算机Java毕设实战-基于SpringBoot和Vue的人力资源管理系统的设计与实现基于springboot的员工绩效管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/8/13 11:49:29

百考通智能任务书生成器:一触即发,让研究与项目规划精准启航

在学术探索与项目管理的起点,一份清晰、完整、专业的任务书是成功的基石。它定义了方向,明确了路径,凝聚了团队共识。然而,无论是学生开启毕业设计、研究者申请课题,还是项目经理启动新项目,撰写任务书的过…

作者头像 李华
网站建设 2026/8/9 0:33:19

大模型开发者必看!OpenClaw协议让AI Agent真正“长出爪子“

一、从「会回答」到「会执行」,Agent 面临的真实问题 这两年我们谈 AI,关键词不断升级: Chatbot → CopilotPrompt → Tool Calling单模型 → 多 Agent / 多 Skill 但真正落到工程里,你很快会遇到几个现实问题: 一…

作者头像 李华