news 2026/9/3 4:04:09

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/9/2 18:28:15

百考通AI开题报告生成器:智能引领学术启航,一键奠定研究基石

站在学术研究的起跑线上,一份高质量的开题报告不仅是课题的“通行证”,更是整个研究过程的“路线图”。它需要清晰地阐明研究背景、明确研究问题、展示研究价值、规划技术路径。然而,从浩如烟海的文献中梳理脉络,在空白文档前构建…

作者头像 李华
网站建设 2026/9/2 20:15:19

AI存储革新:专为大模型设计的高性能存储

随着人工智能技术的飞速迭代,大模型已从实验室走向规模化商用,从百亿参数的初步探索,演进到万亿甚至百万亿参数的多模态大模型,其训练与推理过程中产生的海量数据、极致性能需求,正持续冲击着传统存储架构的边界。传统…

作者头像 李华
网站建设 2026/9/2 20:14:45

常见药用植物草本植物检测数据集VOC+YOLO格式9229张143类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):9229 标注数量(xml文件个数):9229 标注数量(txt文件个数):9229 …

作者头像 李华
网站建设 2026/9/2 20:16:25

Java做人工智能:企业级AI项目落地的核心方法论与实践路径

在人工智能技术向产业深度渗透的阶段,Java做人工智能的价值正在从“技术尝鲜”转向“企业级规模化落地”。不同于Python在AI算法研究与原型验证领域的灵活性,Java凭借其成熟的生态体系、强大的系统稳定性和工程化能力,成为企业存量系统智能化…

作者头像 李华